Der Temperaturunterschied ist groß. Ich möchte nur an warmen Tagen zur Arbeit gehen, aber ich denke darüber nach, die schlechte Routine zu akzeptieren, pünktlich zur Arbeit zu gehen, weil die Leute nicht faul sein müssen, wenn sie von Gewohnheiten gezähmt werden.
Effektive Java 3rd Edition "Der Missbrauch von Streams macht es schwierig, Programme zu verstehen und zu warten."
Plötzlich ist dies die Schlussfolgerung. Der kurze und einfach zu lesende Code ist großartig. Die Stream-API ist jedoch auch einfach, kurzen und esoterischen Code, langen und esoterischen Code zu generieren. Wenn ich von jemandem implementiert werde, der die Stream-API nicht vollständig versteht, einschließlich mir selbst, muss ich mir immer des Risikos einer schlechten Programmlesbarkeit bewusst sein. Dies ist ein Problem für Feldprogrammierer, und die Stream-API ist nicht schlecht. Wenn Sie die Stream-API schreiben möchten, ändern Sie den Speicherort. Bevor sich der von Ihnen implementierte prägnante Code aus der Stream-API aufgrund von Missbrauch durch Kopieren und Einfügen überall verbreitet und zu einem Problem wird.
Wenn es jedoch so endet, wie es ist, tut es mir leid für einige Leute, die immer noch motiviert sind, die Stream-API zu studieren. Deshalb werde ich den Code einführen, der die Stream-API lesbarer macht.
Angenommen, Sie möchten wissen, für welche Geschäfte Ihre Mitarbeiter zuständig sind. Wie kann ich diese Informationen anhand einer bestimmten Fallliste extrahieren? Als Umsetzungspolitik 1, Akquisitionserfassung 2, Erfassung des Wertes, der als Schlüssel aus Datensatz behandelt werden soll 3, Erstellen Sie eine Karte, die dem Schlüsselwert und dem Datensatz entspricht Wird sein. Die Implementierung durch die Stream-API ist wie folgt
/**
*Implementierung durch Stream API.
*Es ist nur ein Erklärungscode und implementiert keine Verbindungsoperationen, Ausnahmebehandlung usw.
* @param salescodeList Eine Liste, in der Codeinformationen gespeichert werden, die die Angelegenheit identifizieren.
* @return <K, V> = {Mitarbeitercode,Liste der verantwortlichen Projekte}
*/
public Map<Integer, List<Record>> getSalesListGroupingByEmployeeCode (List<Integer> salesCodeList) {
List<Record> recordList = searchBySalesCodeList(salesCodeList);
return recordList.stream().collect(
Collectors.groupingBy(recordList::getEmployeeCode));
}
Zuerst bekam ich eine Liste von Aufzeichnungen. Machen Sie dann die Liste der erfassten Datensätze zu einem Stream-Objekt. Jetzt können Sie mit der Stream-Pipeline arbeiten. Lassen Sie uns nun klären, was wir mit der Stream-Pipeline machen wollen. 1, ich möchte Streams in einer Liste sammeln 2, ich möchte eine Gruppierung (Zuordnung) unter Verwendung des Mitarbeitercodes als Schlüssel durchführen Die Implementierung wäre also:
//Das Teil wurde mithilfe der Stream-API extrahiert
recordList.stream(). //Konvertieren Sie ein List-Objekt in ein Stream-Objekt
collect( //Deklarieren Sie, Stream-Objekte als Liste zu sammeln
Collectors.groupingBy( //Gruppierung durchführen
recordList::getEmployeeCode) //Übergeben Sie den für die Gruppierung verwendeten Schlüsselwert als Argument
);
Die StreamAPI konzentriert sich auf "was zu tun ist", daher wäre eine solche Gruppierung und Aufteilung ein gutes Beispiel.
Es ist eine Richtungsänderung, wenn es von der Stream-API implementiert wird. Wenn Sie die Stream-API verbieten und denselben Wert wie zuvor zurückgeben, haben Sie wahrscheinlich eine Implementierung wie die folgende:
/**
*Implementierungen, die die Stream-API nicht verwenden.
*Es ist nur ein Erklärungscode und implementiert keine Verbindungsoperationen, Ausnahmebehandlung usw.
* @param salescodeList Eine Liste, in der Codeinformationen gespeichert werden, die die Angelegenheit identifizieren.
* @return <K, V> = {Mitarbeitercode,Liste der verantwortlichen Projekte}
*/
public Map<Integer, List<SalesRecord>> getSalesListGroupingByEmployeeCode (List<Integer> salesCodeList) {
//HashMap, der als Rückgabewert dieser Methode verwendet werden soll
Map<Integer, List<SalesRecord> result = new HashMap<>();
List<SalesRecord> recordList = searchBySalesCodeList(salesCodeList);
for (List<SalesRecord> record : recordList) {
int employeeCode = record.getEmployeeCode();
//Hier schon Key-Stellen Sie fest, ob ein Wertepaar generiert wurde
//Wenn ein Paar erstellt wurde, kann die Verkaufsliste abgerufen werden, da das Paar bereits im Ergebnis vorhanden ist.
List<SalesRecord> salesList = result.get(employeeCode);
//Wenn das Paar nicht vorhanden ist, kann die Liste, in der die verantwortliche Angelegenheit gespeichert ist, nicht gespeichert werden, sodass eine Liste erstellt wird.
if (salesList == null) {
salesList = new ArrayList<>();
}
salesList.add(record);
result.put(employeeCode, salesList);
}
return result;
}
Die Anzahl der Zeilen hat zugenommen, und es ist nicht ganz klar, was Sie tun möchten.
Das hier gezeigte Implementierungsbeispiel war ein besseres Beispiel für die Implementierung mit Stream. Es gibt jedoch einige, die mit einer for-Anweisung anstelle eines Streams implementiert werden sollten. Wenn die Stream-Pipeline zu viele Zwischenoperationen enthält, ist möglicherweise eine Aufteilung erforderlich. Immerhin ist es "welcher Programmierer bevorzugt". Es ist nicht so klar wie das Verstecken von Informationen. Wenn Sie ein begeisterter Unterstützer der Stream-API sind und Wutanfälle bekommen, wenn Sie aufgefordert werden, die Stream-API zu stoppen, wenn Sie Code überprüfen, der die Stream-API enthält, sind Sie möglicherweise nicht da. Nehmen Sie in diesem Fall die Stream-API aktiv an und bewegen Sie sich auf der Site, bis Sie eine Umgebung finden, die eine hohe Codequalität beibehält.
Recommended Posts