Я играю с forEach в Списке строк, и меня смущает, почему допустима следующая строка:
policies.forEach(policy -> test.addToDatabase(policy, stats));
Это , Вы путаете параметр Iterable::forEach
с параметрами операторов внутри лямбда-выражения. Поскольку единственный параметр внутри Iterable::forEach
- это 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
остается только одним:
policies.forEach(policy -> {
log.info("adding to database");
test.addToDatabase(policy, stats);
log.info("added to database");
});
Теоретически существует неограниченное количество операторов и переменные, с которыми вы можете работать. Единственное условие, что все, что вы используете внутри лямбда-выражения, должно быть окончательно .