Der in der Geschäftslogik übliche Prozess der Aufteilung des Prozesses nach dem Listenindex kann auch mithilfe von Reduzieren implementiert werden. Zum Beispiel "Hinzufügen: zu anderen als dem Anfang der Liste" Logik wie diese kann mit Reduce wie folgt implementiert werden
MyBusinessLogic.java
package test;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiFunction;
import java.util.stream.Stream;
public class MyBunessLogic {
public static void main(String args[]){
final BiFunction<List<String>, String, List<String>> operation =
(accum, value) -> {
if(accum.size()!=0)accum.add(" : "+value);
else accum.add(value);
return accum;
};
Stream.of("start","middle","end")
.reduce(new ArrayList<String>(),operation,(s,v)->s)
.forEach(System.out::print);
}
}
Ausgabeergebnis
start : middle : end
Nachtrag Die Bedeutung des BiFunction-Typs ist schwer zu verstehen. Notieren Sie sich daher seine Verwendung. Der erste und der zweite Typ von Generika sind die Typen von Funktionsargumenten, der erste ist der Akkumulator und der zweite ist der zu berechnende Wert. Der dritte generische Typ zeigt den Rückgabewert an, wenn die Funktion ausgeführt wird
Nachtrag 2 Der Lambda-Ausdruck, der an das dritte Argument von reduct übergeben wird, wird aufgerufen, wenn die Pararell-Methode der Stream-Klasse ausgeführt wird. Das Beispielbeispiel gibt jedoch einen geeigneten Ausdruck an. Dies liegt daran, dass das obige Beispiel Listen der Reihe nach verarbeiten und nicht parallel verarbeiten soll. Persönlich halte ich es für zweckmäßig, wenn die Reduzierungsmethode eine Überlastung von (U indentity, BiFunction \ <U, T, U > func) hätte, eine Methode, die nicht für den Parallelbetrieb vorgesehen ist.
Nachtrag 3 Im obigen Beispiel wird die als Argument des Lambda-Ausdrucks übergebene Variable (accum) destruktiv betrieben, daher werde ich eine verbesserte Version schreiben.
MyBunessLogic.java
package test;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class MyBunessLogic {
public static void main(String args[]){
Stream.of("start","middle","end")
.reduce(new ArrayList<String>(),MyBunessLogic::operate,(s,v)->s)
.forEach(System.out::print);
}
private static List<String> operate(List<String> accum,String value){
List<String> list = new ArrayList<String>(accum);
if(list.size()!=0)list.add(" : "+value);
else list.add(value);
return list;
}
}
Recommended Posts