なぜforEachのメソッドは、消費者が一つだけ引数を取る際に、複数の引数を持つメソッドを呼び出すラムダを受け入れていますか?

amye93:

私は一緒に遊んでいますforEachList<String>、私は次の行が受け入れられる理由について困惑しています:

policies.forEach(policy -> test.addToDatabase(policy, stats));

以来forEach必要でConsumerあり、Consumer受け入れる方法は一つだけ引数を取るの呼び出しが、なぜ、私は理解していないaddtoDatabase、それは二つの引数を取るよう、許容可能です。完全なテストコードについては、以下を参照してください。私は学ぶために、ここで遊んでいますので、このコードは、完全なまたはエレガントを意味するものではないことに注意してください。

public class ConsumerTest {

    private Random random = new Random();

    public static void main(String[] args) {
        ConsumerTest test = new ConsumerTest();
        List<String> policies = new ArrayList<>();
        policies.add("11111");
        policies.add("22222");
        policies.add("33333");
        policies.add("44444");
        policies.add("55555");
        Stats stats = test.new Stats();
        policies.forEach(policy -> test.addToDatabase(policy, stats));
        System.out.println("Success count: " + stats.getSuccessCount() + "\nFailure count: " + stats.getFailureCount());
    }

    private void addToDatabase(String policy, Stats stats) {
        // simulate success/failure adding to DB with Random
        if (random.nextBoolean()) {
            stats.incrementSuccessCount();
            System.out.println("Success for Policy " + policy);
        } else {
            stats.incrementFailureCount();
            System.out.println("Failure for Policy " + policy);
        }
    }

    class Stats {
        private int successCount;
        private int failureCount;
        public void incrementSuccessCount() {
            successCount++;
        }
        public void incrementFailureCount() {
            failureCount++;
        }
        public int getSuccessCount() {
            return successCount;
        }
        public int getFailureCount() {
            return failureCount;
        }
    }
}
ニコラス:

私は、文字列のリストにはforEachで遊んでいて、私は次の行が受け入れられる理由について困惑しています:

policies.forEach(policy -> test.addToDatabase(policy, stats));

それはあります。あなたは、のパラメータを混同Iterable::forEachラムダ式内のステートメントのパラメータを持ちます。内部パラメータのみ以来Iterable::forEach、IS Consumer<T>非常に同じ匿名クラスの実装よりも何もありません。

Consumer<String> consumer = new Consumer<>() {
    @Override
    public void accept(final String policy) {
        test.addToDatabase(policy, stats)
    }
};

policies.forEach(consumer);

それは同じです。

Consumer<String> consumer = policy -> test.addToDatabase(policy, stats);
policies.forEach(consumer);

内部は何である問題ではない-に渡されたパラメータの数Iterable::forEachが残るのみ1:

policies.forEach(policy -> {
    log.info("adding to database");
    test.addToDatabase(policy, stats);
    log.info("added to database");
});

あなたと働くことができるステートメントと変数の数に制限は理論的にあります。何でもラムダ式内で使用することでなければならないという条件だけ効果的に最終的

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=389011&siteId=1