Метод compose
Метод compose класса Function создаёт новую функцию,
которая сначала применяет функцию, переданную в параметре,
а затем - исходную функцию, для которой был вызван метод.
В первый параметр мы передаём функцию, которая выполнится первой.
Результат её применения становится входным значением для исходной функции.
Иными словами, вызов f.compose(g) возвращает функцию,
эквивалентную выражению f(g(x)). Это отличается от метода
andThen, который выполняет функции в обратном порядке.
Синтаксис
default <V> Function<V, R> compose(Function<? super V, ? extends T> before)
Пример
Давайте создадим две функции: одну для добавления 1 к числу,
а вторую для умножения числа на 2. Скомпонуем их так,
чтобы сначала выполнялось умножение, а затем добавление:
import java.util.function.Function;
public class Main
{
public static void main(String[] args)
{
Function<Integer, Integer> addOne = x -> x + 1;
Function<Integer, Integer> multiplyByTwo = x -> x * 2;
Function<Integer, Integer> composed = addOne.compose(multiplyByTwo);
System.out.println(composed.apply(3));
}
}
Результат выполнения кода:
7
Пример
Давайте скомпонуем функции для работы со строками:
первая функция добавляет восклицательный знак,
вторая переводит строку в верхний регистр.
Метод compose сначала применит вторую функцию,
а затем первую:
import java.util.function.Function;
public class Main
{
public static void main(String[] args)
{
Function<String, String> addExclamation = s -> s + "!";
Function<String, String> toUpperCase = s -> s.toUpperCase();
Function<String, String> composed = addExclamation.compose(toUpperCase);
System.out.println(composed.apply("abcde"));
}
}
Результат выполнения кода:
"ABCDE!"
Пример
Давайте используем метод compose вместе со стримами.
Создадим функцию, которая сначала удваивает число,
а затем добавляет к нему 10, и применим её к каждому
элементу списка:
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
Function<Integer, Integer> addTen = x -> x + 10;
Function<Integer, Integer> multiplyByTwo = x -> x * 2;
Function<Integer, Integer> composed = addTen.compose(multiplyByTwo);
List<Integer> res = List.of(1, 2, 3, 4, 5)
.stream()
.map(composed)
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
[12, 14, 16, 18, 20]