Зачем использовать andThen в Consumer функциональном интерфейсе? - PullRequest
0 голосов
/ 08 июля 2019

Я хочу выполнять одно задание одно за другим.Мы можем сделать это двумя способами.

Первый способ:

List<String> list = Arrays.asList("Name1","Name2","Name3");
list.forEach((obj)->{
    System.out.println(obj);  //task1
    System.out.println(obj.length()); //task2
});

Или мы можем сделать так же:

List<String> list = Arrays.asList("Name1","Name2","Name3");
Consumer<String> c1 = (obj)-> System.out.println(obj); //task1
Consumer<String> c2 = (obj)-> System.out.println(obj.length()); //task2
list.forEach(c1.andThen(c2));

В обоих случаяхмы получаем тот же результат, тогда, пожалуйста, помогите мне понять, почему мы используем andThen в Consumer функциональном интерфейсе, если есть какое-то преимущество в его использовании, тогда что это такое.

Заранее спасибо.

1 Ответ

2 голосов
/ 08 июля 2019

Одна из идей, стоящих за функциями (Function<A, B>), заключается в том, что они являются компонуемыми,

например.g(f(x)), что эквивалентно f.andThen(g).apply(x) в java.

Определение одной функции или нескольких функций зависит от ответственности, которую вы хотите дать за каждую функцию.

Например, вы можете иметь отдельную "функцию"для увеличения числа "и" функция для создания квадрата числа ", таким образом, вы можете использовать их повторно при необходимости.

    Function<Integer, Integer> f = a -> a + 1;
    Function<Integer, Integer> g = a -> a * a;

    var  incrementAndSquare = f.andThen(g).apply(2); //9

    Function<Integer, Integer> h = a -> a - 1;

    var decrementAndSquare = h.andThen(g).apply(5); //16

Примечание : Consumer<A> в Java такжефункция Function<A, void>, которая возвращает void.

В вашем случае, если ее просто println, может быть, одной функции будет достаточно, если вам не нужна такая же функция где-то еще.

Если вы делаете два "отдельные задачи ", вы можете определить отдельные функции.Это делает ответственность яснее, обеспечивает компоновку, легко тестирует функции по отдельности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...