[JAVA] Ihnen, denen im Feld "Keine Stream-API verwenden" mitgeteilt wurde

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.

"Der Missbrauch von Streams macht es schwierig, Programme zu verstehen und zu warten."

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.

Kurze und einfach zu lesende Implementierung der Stream-API

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.

Implementierung ohne Stream API

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.

Gibt an, ob die Stream-API verwendet werden soll

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

Ihnen, denen im Feld "Keine Stream-API verwenden" mitgeteilt wurde
[java8] Um die Stream-API zu verstehen
Verwenden Sie Stream in Java?
Versuchen Sie es mit der Stream-API in Java
Ich habe versucht, die Stream-API zusammenzufassen
Der Typ, der mit Fehlern im Stream nicht umgehen kann
Möglicherweise möchten Sie die Methode remove in ArrayList nicht sehr oft verwenden
Wenn Sie die Methode außerhalb verwenden möchten
Für diejenigen, die MySQL für die Datenbank in der Umgebungskonstruktion von Rails6 ~ verwenden möchten.
Verwenden Sie Java-Lambda-Ausdrücke außerhalb der Stream-API
[Rails] Ich weiß nicht, wie ich das Modell verwenden soll ...
Java: Verwenden Sie Stream, um den Inhalt einer Sammlung zu sortieren
Verwenden Sie JLine, wenn Sie Tastenanschläge auf der Konsole zeichenweise in Java verarbeiten möchten
Verwenden Sie collection_select, um die in Active_Hash gespeicherten Daten abzurufen
Für Sie, die von unerwarteten Dezimalstellen in Java betroffen sind
[Ein Muss für einen Java-Ingenieurlehrling] Verwendung der Stream-API
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
Ich möchte die Java 8 DateTime-API (jetzt) langsam verwenden.
Aufrufen und Verwenden der API in Java (Spring Boot)
Jetzt ist es an der Zeit, mit der Stream-API zu beginnen
Ich war seltsamerweise süchtig danach, Javas Stream-API mit Scala zu verwenden
Was tun, wenn der Befehl Rails unbrauchbar wird?
Wenn Sie eine Methode in RSpec verspotten möchten, sollten Sie die Methode allow für mock und die Singleton-Methode verwenden.
Verwendung der Ketten-API
Java Stream API in 5 Minuten
[Java] Einführung in die Stream-API
[Rails / Routing] So verweisen Sie auf den Controller in Ihrem eigenen Verzeichnis
Wenn Sie die übergeordnete Klasse in Lomboks @builder aufnehmen möchten
Betrachten wir die Bedeutung von "Stream" und "Collect" in der Stream-API von Java.
Beispielcode zum Aufrufen der Yahoo! Local Search API in Java
Was tun, wenn Sie Ihr Root-Passwort unter CentOS7 vergessen haben?
Nutzen Sie entweder für die individuelle Ausnahmebehandlung in der Java Stream-API