# Listen und Streams filtern



## Eder1309 (28. Sep 2017)

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: 


```
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: 


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

*Mein Problem: *Wenn ich dann schreibe

```
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 (28. Sep 2017)

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.

```
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 (28. Sep 2017)

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

Hier der (richtige) 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 (28. Sep 2017)

Eder1309 hat gesagt.:


> 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


----------

