verschachtelte for-Schleife in einen Stream umwandeln?

ac0h1m

Mitglied
Hallo, ich möchte verschachtelte for-Schleifen in einen Stream umwandeln und die Objekte in einer Liste sammeln. Wie ich filtere usw. weiß ich jedoch nicht wie ich verschachtelte for-schleifen in einem Stream umschreibe. Hier mein Code und mein Ansatz in Kommentarzeilen:

Java:
    public static List<PerformanceData> filterByCat(List<PerformanceData> input, String s) {
        
//        var  filterByCatListe = input
//                .stream()
//                .filter(x -> (cat.equals(s)))
//                .collect(Collectors.toList());
        
//        return filterByCatListe;
        
                ArrayList<PerformanceData>  filterByCatListe = new ArrayList<>();
                for (var x: input) {
                    var Liste = new ArrayList<>(Arrays.asList(x.cat().split(",")));
                    for (var cat : Liste) {
                        if (cat.equals(s)) {
                            filterByCatListe.add(x);
                        }
                    }
                } return filterByCatListe;
    }

Das Ziel ist es nur die PerformanceData-Objekte zurückgeben, welche in der
gegebenen Kategorie sind. Aber „cat“ ist eine kommaseparierte Liste an Kategorien, in welcher sich ein Event (/Funktion/etc.) befindet.
 
Der Ansatz ist auch nicht anders als vorher. Betrachte nur das Innere:
Du hast x.cat() und machst brauchst dann:
  • erst einen Stream
  • dann den Filter
  • dann die Auswertung des Streams (Hier geht es ja dann darum, ob es ein Element gibt oder nicht).

Dann hast Du ein Konstrukt, dass Du z.B. als Filter in dem äußeren Konstrukt verwenden könntest.

Das ist also erneut ein einfacher, gradliniger Ansatz. Wobei jetzt hier der Hinweis von @LimDul sehr wichtig wird: Du hast halt etwas, das einfach unleserlich ist. Und das gehört da auch nicht hin. Die Prüfung, ob ein PerformanceData Element zu einer Kategorie gehört oder nicht, könnte man z.B. in der Klasse PerformanceData implementieren (So man wirklich das so als String mit Komma getrennten Werten lassen will - schon das ist Quatsch. Das Thema hatten wir aber schon in früheren Threads und klar: Das ist vorgegeben und da kannst Du nichts anpassen!

Edit: Die 3 Schritte sind halt das Standard vorgehen. Aber wenn man sich Stream anschaut, dann findet man ggf. etwas, das diese Punkte zusammen fasst.
 
Der Ansatz ist auch nicht anders als vorher. Betrachte nur das Innere:
Du hast x.cat() und machst brauchst dann:
  • erst einen Stream
  • dann den Filter
  • dann die Auswertung des Streams (Hier geht es ja dann darum, ob es ein Element gibt oder nicht).

Dann hast Du ein Konstrukt, dass Du z.B. als Filter in dem äußeren Konstrukt verwenden könntest.

Das ist also erneut ein einfacher, gradliniger Ansatz. Wobei jetzt hier der Hinweis von @LimDul sehr wichtig wird: Du hast halt etwas, das einfach unleserlich ist. Und das gehört da auch nicht hin. Die Prüfung, ob ein PerformanceData Element zu einer Kategorie gehört oder nicht, könnte man z.B. in der Klasse PerformanceData implementieren (So man wirklich das so als String mit Komma getrennten Werten lassen will - schon das ist Quatsch. Das Thema hatten wir aber schon in früheren Threads und klar: Das ist vorgegeben und da kannst Du nichts anpassen!

Edit: Die 3 Schritte sind halt das Standard vorgehen. Aber wenn man sich Stream anschaut, dann findet man ggf. etwas, das diese Punkte zusammen fasst.
danke für die ausführliche Antwort, jedoch habe ich leider keine Ahnung wie ich das mit dem Filter umsetzt...?
 
Wir betrachten nur den inneren Teil:
Java:
                    var Liste = new ArrayList<>(Arrays.asList(x.cat().split(",")));
                    for (var cat : Liste) {
                        if (cat.equals(s)) {
                            filterByCatListe.add(x);
                        }
                    }

Und da ist es dann 1:1 - hier ist die Bedingung dieses cat.equals(s) und genau das kannst Du umsetzen!

Die erste Zeile passt Du also so an, dass da ein Stream der Kategorien kommt.
Das if wird zu einem Filter.

Ledglich dieses add ist hier nicht 1:1 umsetzbar. Denn das ist ja aus der äußeren Schleife und die innere Schleife ist nur ein Kriterium, ob ein Element genommen werden soll oder nicht.

Die äußere Schleife wird also zu etwas wie:
Java:
        return input.stream()
                .filter(
                    x -> Das, was Du bei der inneren Schleife machst und wo dann also true oder false raus kommen muss!
                )
                .collect(Collectors.toList());
 

Zurück
Oben