Wie schreibe ich eine For-Schleife in ein Stream API um?

ac0h1m

Mitglied
Hallo, ich hab ein Problem ich will eine for-Schleife in ein Stream umschreiben. Jedoch habe ich da große Schwierigkeiten. Der folgende Code zeigt meine for-Schleife:

Java:
public static List<PerformanceData> filterByIDs(List<PerformanceData> input, int pid, int tid) {
                
    var filterByIDsListe = new ArrayList <PerformanceData>();
                 for(var x : input) {
                     if((pid == -1 || x.pid() == pid) && (tid == -1 || x.tid() == tid)) {
                         filterByIDsListe.add(x);
                     }
                 } return filterByIDsListe;
    }
 
Wo genau ist denn Dein Problem? Das, was Du da brauchst sind ja relativ einfache Dinge:
a) Aus einer List einen Stream bekommen. Kriegst Du das hin?
b) Du willst nur bestimmte Elemente haben - Wie kannst Du in Streams Elemente filtern?
c) Zuletzt willst Du die Elemente sammeln in einer Liste - also wäre das dritte Thema das Sammeln von Elementen.

Alle drei Teile kann man relativ einfach und gut nachlesen. Dann ist alles einfach nacheinander anzuwenden und schon bist du fertig.
 
Wo genau ist denn Dein Problem? Das, was Du da brauchst sind ja relativ einfache Dinge:
a) Aus einer List einen Stream bekommen. Kriegst Du das hin?
b) Du willst nur bestimmte Elemente haben - Wie kannst Du in Streams Elemente filtern?
c) Zuletzt willst Du die Elemente sammeln in einer Liste - also wäre das dritte Thema das Sammeln von Elementen.

Alle drei Teile kann man relativ einfach und gut nachlesen. Dann ist alles einfach nacheinander anzuwenden und schon bist du fertig.
Also mein Ansatz wäre folgender:
Java:
var filterByIDsListe = new ArrayList <PerformanceData>()
                .stream()
                .filter(null)
                .collect(Collectors.toList());
        
        return filterByIDsListe;

Jedoch habe ich mit der Filtermethode noch Schwierigkeiten. Ich muss das If-Statement einsetzen um zu filtern. Jedoch zeigst mit bei den pid und tid variablen immer einen Fehler an, dass ich da getter und setter Methoden erstellen soll. Bei nem Record heißen die ja dann pid() und tid() aber das ist ja nicht der Plan. Ich will ja wissen ob pid == -1 oder tid == -1 ist.
 
Bei filter bietet sich immer, wenn es nicht ein ganz simpler Filter ist, eine eigene Methode zu erstellen mit der Signatur am besten:

Java:
boolean isRelevant(MyClass zuTestendesObjekt);
Hier wäre MyClass = PerformanceData.

Problem hier ist, dass das nicht reicht, weil noch weitere Variablen (pid & tid) brauchst. Dann sieht die Signatur halt so aus:

Java:
boolean isRelevant(PerformanceData data, int pid, int tid);

Die kannst du dann einfachmal mittels filter(data -> isRelevant(data, pid, tid)) aufrufen.
 
Du willst doch aus der ArrayList "input" einen Stream machen. Tust du aber nicht.

Ist nicht das was Konrad beschrieben hat.
 
Bei filter bietet sich immer, wenn es nicht ein ganz simpler Filter ist, eine eigene Methode zu erstellen mit der Signatur am besten:

Java:
boolean isRelevant(MyClass zuTestendesObjekt);
Hier wäre MyClass = PerformanceData.

Problem hier ist, dass das nicht reicht, weil noch weitere Variablen (pid & tid) brauchst. Dann sieht die Signatur halt so aus:

Java:
boolean isRelevant(PerformanceData data, int pid, int tid);

Die kannst du dann einfachmal mittels filter(data -> isRelevant(data, pid, tid)) aufrufen.
Ich will allerdings keine neue Methode dafür erstellen, wie würde der Filter ohne eigene Methode aussehen?
 
Du willst doch aus der ArrayList "input" einen Stream machen. Tust du aber nicht.

Ist nicht das was Konrad beschrieben hat.

Ja habe ich auch grade bemerkt. Hab es abgeändert:
Java:
  public static List<PerformanceData> filterByIDs(List<PerformanceData> input, int pid, int tid) {

        var filterByIDsListe = new ArrayList <PerformanceData>();

        input
        .stream()
        .collect(Collectors.toList());

        return filterByIDsListe;
 
Naja nur halt data -> { .... Statements die ein true/false liefern }

Wäre halt nur extrem unleserlich - warum willst du keine eigene Methode machen? Mehr Methoden sind meist sinnvoller als weniger.
ja, allerdings wollen die Ersteller des Projekts keine zusätzlichen Methoden oder ähnliches. Also ich darf nur die Methode an sich umändern.
 
Aktuell bin ich soweit:
Java:
input
        .stream()
        .filter(x -> (pid == -1 || x.pid() == pid) && (tid == -1 || x.tid() == tid))
        .collect(Collectors.toList());

Wie jedoch füge ich alle Objekte in eine neue Liste hinzu?
 
Ich habs hinbekommen, hier noch die Lösung:

Java:
 var filterByIDsListe = input
        .stream()
        .filter(x -> (pid == -1 || x.pid() == pid) && (tid == -1 || x.tid() == tid))
        .collect(Collectors.toList());

        return filterByIDsListe;
 
Ich habs hinbekommen, hier noch die Lösung:

Java:
 var filterByIDsListe = input
        .stream()
        .filter(x -> (pid == -1 || x.pid() == pid) && (tid == -1 || x.tid() == tid))
        .collect(Collectors.toList());

        return filterByIDsListe;
Eine lokale Variable braucht es dabei aber dann auch nicht wirklich. Und den erste Aufruf packt man üblicher Weise direkt in die erste Zeile. Das Ergebnis würde bei mir dann so aussehen:
Java:
return input.stream()
        .filter(x -> (pid == -1 || x.pid() == pid) && (tid == -1 || x.tid() == tid))
        .collect(Collectors.toList());
 

Zurück
Oben