Listen und Streams filtern

Eder1309

Mitglied
Liebes Forum, da bin ich schon wieder mit der nächsten Frage. :)

Folgende Aufgabenstellung: Eine Methode excludeTooShort(int laenge, List<String> woerter) schreiben, die alle Wörter verwirft, die kürzer als laenge sind. Gegeben: Eine Liste aus zehn Wörtern (words). Bedingung der Übungsaufgabe: Die Methode muss Datenströme nutzen und eine Ergebnisliste zurückgeben.

Hier der bisherige Code:

Java:
import java.util.*;
import java.util.stream.*;

public class Streams {
   
    public static List <Integer> excludeTooShort(List<String> woerter, int laenge){
       
        Stream <String> stream = woerter.stream();
        Stream <Integer> lengthStream = stream.map((String name)->{
            return (int) name.length();
        });
        Stream <Integer> result = lengthStream.filter((Integer hilfe)-> {
            return (hilfe > laenge);
        });
        return result.collect(Collectors.toList());
        }   

    public static void main(String[] args){
        List <String> words = Arrays.asList("Peter", "Freda", "Klaus",
                "Johanna", "Michaela", "Simone", "Christian", "Michi", "Lukas", "Daniel" );
        System.out.println(excludeTooShort(words, 6));   
    }
}


Funktioniert soweit, die Konsole gibt [7, 8, 9] aus, das ist die Anzahl der Buchstaben von "Johanna", "Michaela" und "Christian". Ich würde aber gerne die Namen ausgeben, sprich den Stream lengthStream wieder umwandeln. Dachte an Folgendes:

Code:
    Stream <String> finalresult = lengthStream.map((Integer hilfe2) ->{
        return hilfe2.toString();
    });

Mein Problem: Wenn ich dann schreibe
Java:
return finalresult.collect(Collectors.toList());
Kommt die Meldung: cannot convert from List<String> to List<Integer>. Wenn ich die Methode aber in List <String> excludeTooShort ändere, kommen sehr viele und für mich unverständliche (bin ganz frisch in der Programmierung :)) Fehlermeldungen.

Sorry für den langen Text, ich wollte es so verständlich wie möglich formulieren...

Vielen Dank für eure Hilfe und einen schönen Abend!
 

Tarrew

Top Contributor
Dein Stream mit den Längen der Strings bringt dir nichts, weil du damit nicht wieder zurück zu den Strings kommst.

Du musst aber garkein so kompliziert über einen eigenen Integer-Stream mit den Wortlängen gehen, einfach eine andere Filterbedingung direkt auf die Strings anwenden.
Java:
public static List<String> excludeTooShort(List<String> woerter, int laenge) {
    return woerter.stream().filter((s)-> s.length() >= laenge).collect(Collectors.toList());
}

Ich sehe auch gerade, dass deine Methode als Rückgabewert eine List<Integer> hat. Du willst ja vermutlich die entsprechend gefilterten Wörter zurückgeben, also eher List<String> ?
 

Eder1309

Mitglied
Hey, vielen vielen Dank, so funktioniert es. Ich hab irgendwie das Gefühl, als Programmieranfänger denkt man manchmal viel zu umständlich o_O

Hier der (richtige) Code:

Code:
import java.util.*;
import java.util.stream.*;

public class Streams2 {
   
    public static List <String> excludeTooShort (List <String> woerter, int laenge){
        return woerter.stream().filter((String s)
                ->s.length() >= laenge).collect(Collectors.toList());
    }
    public static void main (String [] args){
        List <String> words = Arrays.asList("Peter", "Freda", "Klaus",
                "Johanna", "Michaela", "Simone", "Christian", "Michi", "Lukas", "Daniel" );
        System.out.println(excludeTooShort(words, 7));
    }
}

Eine Frage hätte ich noch: In der Aufgabenstellung steht, man MUSS Datenströme nutzen, durch woerter.stream() wird dann die Liste woerter automatisch in einen Stream umgewandelt oder? Sprich, die Deklaration in dem ursprünglichen Code kann ich mir sparen? :)

Danke und VG
 

mrBrown

Super-Moderator
Mitarbeiter
Eine Frage hätte ich noch: In der Aufgabenstellung steht, man MUSS Datenströme nutzen, durch woerter.stream() wird dann die Liste woerter automatisch in einen Stream umgewandelt oder? Sprich, die Deklaration in dem ursprünglichen Code kann ich mir sparen? :)
Ja, die explizite Deklaration ist überflüssig ;)
stream() gibt immer einen Stream zurück, egal ob man den extra deklariert oder nicht ;)
 

Neue Themen


Oben