Oto wariant odpowiedzi Eugeniusza, tylko dla zabawy :
public static <T> Function<T, T> combine(List<Function<T, T>> functions) {
return new Object() {
Function<List<Function<T, T>>, Function<T, T>> combiner = list ->
list.size() == 1 ? list.get(0) :
list.get(0).andThen(this.combiner.apply(list.subList(1, list.size())));
}.combiner.apply(functions);
}
To tworzy anonimową klasę wewnętrzną z atrybutem, który jest rekurencyjną lambda. Ten atrybut ma nazwę combiner
i jest to funkcja wyższego rzędu, która pobiera listę funkcji jako argument i zwraca funkcję jako wynik. Ta funkcja wyższego rzędu zwraca pierwszą funkcję listy, jeśli lista zawiera tylko jeden element lub stosuje andThen
do pierwszej funkcji listy, z funkcją, która wynika z rekursywnego wywołania funkcji wyższego rzędu z podlistą funkcje zaczynające się od drugiego elementu.
Anonimowa klasa wewnętrzna jest potrzebna, ponieważ rekurencyjne lambdy można zdefiniować tylko jako atrybuty klasy.
Nie trzeba dodawać, że jest to o wiele bardziej skomplikowane niż przesyłanie strumieniowe listy i zmniejszanie za pomocą operatora binarnego Function::andThen
. Poza tym rekurencyjne lambdy nie są za darmo: używają stosu do wywołań rekursywnych.
możesz wpisać wartość i '# forEach' listę' funkcji', ale to tak naprawdę nie zyskuje niczego (i nie jest tak funkcjonalne). Ogólnie kod wygląda dobrze, co to jest, java jest imperatywny język. – Rogue
[Praca z ArrayList funkcji w Java-8] (https://stackoverflow.com/questions/30274124/working-with-arraylist-of-functions-in-java-8) To pomoże –
Wygląda blisko to [this one] (https://stackoverflow.com/q/32338553/2711488) ... – Holger