Я согласен, что не имеет смысла создавать отдельный экземпляр Consumer<String>
для каждого оператора только для использования andThen
.
Однако, если у вас уже есть два Consumer<String>
экземпляра (c1
и c2
), и вам нужно выполнить оба, вы можете написать:
list.forEach(x -> {
c1.accept(x);
c2.accept(x);
});
или
list.forEach(c1.andThen(c2));
В этом случае последнее явно чище.
РЕДАКТИРОВАТЬ:
Я хотел бы расширить на случай, когда вы создаете свои собственные Consumer
с (то есть не повторно использовать уже существующие). Когда вы присваиваете лямбда-выражение переменной Consumer
, вы можете использовать этот экземпляр Consumer
в нескольких местах вместо дублирования лямбда-выражения. Это верно для любого функционального интерфейса.
Как только вы решите использовать переменную Consumer
, решение о том, иметь ли Consumer
, реализующий сложные логики c или 2 более простых Consumer
с, каждая реализующая часть логики c зависит от того, есть ли необходимость в некоторых случаях выполнять только часть логики c (или изменять порядок, в котором выполняются части логики c) .
Наличие c1
и c2
позволяет использовать одну из следующих опций:
list.forEach(c1);
list.forEach(c2);
list.forEach(c1.andThen(c2));
list.forEach(c2.andThen(c1));
Если у вас был один потребитель, который выполняет лог c обоих c1
и c2
, у вас меньше гибкости.