2016-04-08 8 views
0

Ich habe ein kleines Problem, nämlich ich möchte Integer von einem String über Lambda-Ausdruck erhalten. Ich habe kleinen Code geschrieben, aber ich bekomme nur einzelne Zeichen.Integer von String über Lambda-Ausdruck

Beispiel:

String = "He11o W00rld" 

ich [1, 1, 0, 0] aber ich will [11, 00]. Gibt es dafür eine Lösung?

Mein Code:

Function<String, List<Integer>> collectInts = f -> { 
    return f.chars() 
      .filter(s -> (s > 47 && s < 58)) 
      .map(r -> r - 48) 
      .boxed() 
      .collect(Collectors.toList());}; 
+0

ein besonderen Grund Sie es durch Lambda-Ausdruck tun müssen? –

+0

Ja, ich muss dies für Lernübungen tun ... – Patrykos

+1

Werfen Sie einen Blick auf ['Pattern # splitAsStream()'] (https://docs.oracle.com/javase/8/docs/api/java/util/regex /Pattern.html#splitAsStream-java.lang.CharSequence-) –

Antwort

2

können Sie tun:

Stream.of(f.split("[^\\d]+")) 
    .filter(s -> !s.isEmpty()) // because of the split function 
    .map(Integer::parseInt) 
    .collect(toList()) 
+0

Vielen Dank, Ihre Lösung funktioniert! – Patrykos

4

Sie können das folgende Lambda verwenden:

Function<String, List<Integer>> collectInts = s -> 
    Pattern.compile("[^0-9]+") 
      .splitAsStream(s) 
      .filter(p -> !p.isEmpty()) 
      .map(Integer::parseInt) 
      .collect(Collectors.toList()); 

Hier verwendet wird Pattern.splitAsStream() Stromgenerator, der eine gegebene Eingabe von regex aufteilt. Dann wird jedes Teil überprüft, ob es nicht leer ist und in Integer konvertiert.

Übrigens, wenn Sie 00 statt 0 benötigen, sollten Sie keine Nummer analysieren (überspringen Integer::parseInt Mapping und sammeln, um List<String>).