Ich habe versucht, mit der Java Stream-API eine Methode zu erstellen, die mehrere Filter gleichzeitig anwendet. Ist das in Ordnung?

Vor

Angenommen, Sie haben ein DTO wie das folgende:

/**
 *Eingabe mit mehreren Filterbedingungen.
 * <p>
 ** Tatsächlich kann es komplizierter oder komplexer sein...
 */
@Data
class InputDto {

    /**Bedingungen für Filter 1*/
    private boolean conditions1;
    /**Bedingung 2 für Filter verwendet*/
    private boolean conditions2;
    /**Bedingung 3 für Filter verwendet*/
    private boolean conditions3;
    /**Bedingung für Filter 4*/
    private boolean conditions4;
    /**Bedingung für Filter 5*/
    private boolean conditions5;

    // ...
}

Wenn ich diese DTO-Liste nach Bedingungen zusammenfasse, denke ich, dass sie oft wie folgt geschrieben wird.

private void count(List<InputDto> inputs) {

    //Anzahl der Fälle, in denen Bedingung 1 auf die Eingabe angewendet wird
    inputs.stream()
        .filter(i -> i.isConditions1())
        .count();

    //Anzahl der Fälle, in denen Bedingung 2 auf die Eingabe angewendet wird
    inputs.stream()
        .filter(i -> i.isConditions2())
        .count();

    //Bedingung 3 für die Eingabe,Anzahl der Fälle, in denen 4 angewendet wird
    inputs.stream()
        .filter(i -> i.isConditions3())
        .filter(i -> i.isConditions4())
        .count();

    //Bedingung 1 für die Eingabe, 3,Anzahl der Fälle, in denen 5 angewendet wird
    inputs.stream()
        .filter(i -> i.isConditions1())
        .filter(i -> i.isConditions3())
        .filter(i -> i.isConditions5())
        .count();
}

Damit

/**
 *Ausgabe mit aggregierten Ergebnissen.
 */
@Data
class OutputDto {

    /**Anzahl der Fälle, auf die Bedingung 1 angewendet wurde*/
    private Long count1;
    /**Anzahl der Fälle, auf die Bedingung 2 angewendet wird*/
    private Long count2;
    /**Bedingung 3,Anzahl der Fälle, auf die 4 angewendet wurden*/
    private Long count3And4;
    /**Bedingung 1, 3,Anzahl der Fälle, auf die 5 angewendet wurden*/
    private Long count1And3And5;

    // ...
}

Wenn Sie das Ausgabe-DTO wie folgt füllen,

private void makeOutput(List<InputDto> inputs) {
        
    OutputDto.builder()
    	.count1(inputs.stream()
                .filter(i -> i.isConditions1())
                .count())
    	.count2(inputs.stream()
                .filter(i -> i.isConditions2())
                .count())
    	.count3And4(inputs.stream()
                    .filter(i -> i.isConditions3())
                    .filter(i -> i.isConditions4())
                    .count())
    	.count1And3And5(inputs.stream()
                        .filter(i -> i.isConditions1())
                        .filter(i -> i.isConditions3())
                        .filter(i -> i.isConditions5())
                        .count())
    	.build();
}

Ist es so

Die Bedingung ist "boolesch", so dass ich sie immer noch lesen kann, aber ich konnte sie nicht sehen, als das DTO des Kindes herauskam: müde_gesicht:

Also fragte ich mich, ob es einfacher zu lesen wäre.

Ich dachte über eine Methode nach, die ich für leicht lesbar hielt

Gedanken

Die Stream API von Java ist praktisch, aber wenn Sie sie in eine Liste wie Lambda-Ausdrücke schreiben, kann es schwierig werden, sie zu lesen: enttäuscht_relieved:

Also dachte ich darüber nach, die Methoden zu teilen, damit ich verstehen konnte, was ich tun wollte.

Langer Filter und Aggregat(List<InputDto>Liste der Eingaben, Predicate<? super InputDto>...Viele Filter) {
    //Gonyo Gonyo
Anzahl der Rücksendungen;
}

So was.

Wenn Sie "viele Filter" in Lambda-Ausdrücken schreiben, bleibt dies außerdem schwer zu erkennen, sodass dies auch eine Methode ist.

Predicate<? super InputDto>Ein bestimmter Filter() {
Eingabe zurückgeben->Filtern mit Eingängen;
}
// ...Kürzung

Auf diese Weise, wenn Sie es verwenden

Filtern und aggregieren(Liste der Eingaben,Ein bestimmter Filter(),Andere Filter());

Es fühlt sich an wie ** Einfach zu lesen und kürzer! Ich dachte **.

Was Sie implementiert haben

Die Filter- und Aggregatmethode

/**
 *Wenden Sie alle mit variablen Argumenten übergebenen Filter auf die Liste der Eingaben an und geben Sie die Nummer zurück.
 *
 * @param inputs
 * @param filters
 * @Anzahl der Fälle nach Anwendung des Rückgabefilters
 */
private final Long filterCount(List<InputDto> inputs, Predicate<? super InputDto>... filters) {
    Stream<InputDto> work = inputs.stream();
    for (Predicate<? super InputDto> filter : filters) {
        work = work.filter(filter);
    }
    return work.count();
}

Ich habe es so implementiert.

Da "Stream" nicht wiederverwendet werden kann, fühlt es sich an, als würde man mit "für jede Anweisung" filtern.

Die "bestimmte Filter" -Methode

/**
 * @return {@link InputDto#isConditions1()}Filtern mit
 */
private Predicate<? super InputDto> filter1() {
    return i -> i.isConditions1();
}

/**
 * @return {@link InputDto#isConditions2()}Filtern mit
 */
private Predicate<? super InputDto> filter2() {
    return i -> i.isConditions2();
}

// ...Unterlassung

/**
 * @return {@link InputDto#isConditions5()}Filtern mit
 */
private Predicate<? super InputDto> filter5() {
    return i -> i.isConditions5();
}

Wir haben es auf dem Mindestniveau vorbereitet, damit es wiederverwendet werden kann.

Ich habe es tatsächlich benutzt

Wenn Sie den Vorgang des Packens in die in der Einführung angezeigte Ausgabe umschreiben

private void makeOutput(List<InputDto> inputs) {
        
    OutputDto.builder()
    	.count1(filterCount(inputs, filter1()))
    	.count2(filterCount(inputs, filter2()))
    	.count3And4(filterCount(inputs, filter3(), filter4()))
    	.count1And3And5(filterCount(inputs, filter1(), filter3(), filter5()))
    	.build();
}

Ich fühle mich so.

Wie ist das? Einfach zu lesen: Denken :: Frage:

War das in Ordnung?

Dies war der Code, den ich vor langer Zeit geschrieben habe, aber ich erinnerte mich, dass andere Leute sagten, er sei nützlich.

Ich war glücklich, weil ich es mit viel Mühe geschrieben habe, aber ** Gibt es einen besseren Weg, es zu schreiben? Die Frage kam auf und ich schrieb den Artikel.

Java-Programmierer in der Welt!

Unabhängig von der "Stream API"

Es gibt so eine Art zu schreiben - es ist leicht zu lesen -

Ich wäre Ihnen dankbar, wenn Sie es mich wissen lassen könnten! : yum:

** Ich habe ein Codebeispiel, das gut in den Kommentarbereich passt! Bitte sehen Sie, ob Sie interessiert sind! !! ** ** **

Beachten

Recommended Posts

Ich habe versucht, mit der Java Stream-API eine Methode zu erstellen, die mehrere Filter gleichzeitig anwendet. Ist das in Ordnung?
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, den Block mit Java zu brechen (1)
Ich habe versucht, mit Java und Spring eine Funktion / einen Bildschirm für den Administrator einer Einkaufsseite zu erstellen
[Azure] Ich habe versucht, eine kostenlose Java-App zu erstellen ~ Mit FTP verbinden ~ [Anfänger]
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
[Rails] Ich habe versucht, eine Mini-App mit FullCalendar zu erstellen
Ich habe versucht, mit Docker eine Padrino-Entwicklungsumgebung zu erstellen
Ich möchte eine Schleife schreiben, die auf einen Index mit der Stream-API von Java 8 verweist
Da das Lesen von JdbcCodeList von TERASOLUNA langsam ist, habe ich versucht, mehrere gleichzeitig zu registrieren.
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, die Java8 Stream API zu verwenden
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe versucht, eine Web-API zu erstellen, die mit Quarkus eine Verbindung zur Datenbank herstellt
Ich möchte mit Jakarta EE 8 mit Java 11 ein dunkles Web-SNS erstellen
Ich habe versucht, die Stream-API zusammenzufassen
Ich habe versucht, 10 ausgewählte Fragen aus der Vergangenheit zu lösen, die nach der Registrierung bei AtCoder mit Java, Stream API, gelöst werden sollten
Als ich eine Methode für Premium Friday erstellen wollte, war sie bereits in der Java 8-Standard-API enthalten
Ich habe ein Programm erstellt, das aus dem mit Java überladenen Prozess nach der Zielklasse sucht
[Java] Ich habe JDBC installiert und versucht, eine Verbindung mit Servlet + MySQL herzustellen. (Es gibt eine Version mit DAO / Bean)
Ich habe versucht, ein Portfolio mit AWS, Docker, CircleCI, Laravel [mit Referenzlink] zu erstellen.
[Java] Ich habe versucht, über den Verbindungspool eine Verbindung mit Servlet (Tomcat) & MySQL & Java herzustellen
[Azure] Ich habe versucht, eine Java-App für die Erstellung von kostenlosen Web-Apps zu erstellen. [Anfänger]
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Java Ich habe versucht, einen einfachen Block zu brechen
Ich habe versucht, eine LINE-Klon-App zu erstellen
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
Ich habe versucht, ein Tool zum Vergleichen von Amazon-Produktpreisen auf der ganzen Welt mit Java, der Amazon Product Advertising API und der Currency API (29.01.2017) zu erstellen.
Ich habe versucht, was ich mit Stream leise versuchen wollte.
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
[Java 11] Ich habe versucht, Java auszuführen, ohne mit Javac zu kompilieren
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, Animationen mit der Blazor + Canvas-API zu zeichnen
Ich habe versucht, mit OCR eine PDF-Datei mit Java zu verarbeiten
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
[Java] Ich habe versucht, die Yahoo API-Produktsuche zu implementieren
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Erstellen Sie einen SlackBot mit AWS Lambda & API Gateway in Java
Erstellen Sie eine Methode, um den Steuersatz in Java zurückzugeben
Ich habe versucht, den Chat mit dem Minecraft-Server mit der Discord-API zu verknüpfen
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Jetzt ist es an der Zeit, mit der Stream-API zu beginnen
Ich habe einen RESAS-API-Client in Java erstellt
Ich habe versucht, eine PDF-Datei mit Java part2 zu verarbeiten
Konvertieren Sie ein zweidimensionales Array mit der Java 8 Stream-API in das CSV-Format
Ich habe versucht, mit Ractor mehrere Objekte übergeben zu können
Ich habe versucht, den Code zu implementieren, um mehrere Bilder gleichzeitig in der Watson Visual Recognition Collection in Java zu lernen
Erstellen Sie eine Java-Methode [Memo] [java11]
[Java] Einführung in die Stream-API
So erstellen Sie eine Methode
Ich habe versucht, eine einfache Karten-App in Android Studio zu erstellen
Ich kann in IntelliJ keine Java-Klasse mit einem bestimmten Namen erstellen
Ich habe versucht, eine Spring MVC-Entwicklungsumgebung auf einem Mac zu erstellen
Herstellen einer Verbindung zu einer Datenbank mit Java (Teil 1) Möglicherweise die grundlegende Methode
Ich habe versucht zu verstehen, wie die Rails-Methode "redirect_to" definiert ist
Erstellt eine Methode zum Anfordern von Premium Friday (Java 8-Version)