2016-11-29 2 views
8

Ich habe einen String:Java 8 convert String von Ints zur Liste <Integer>

String ints = "1, 2, 3"; 

Ich möchte es auf eine Liste von ints konvertieren:

List<Integer> intList 

Ich bin in der Lage, es zu konvertieren eine Liste von Zeichenketten auf diese Weise:

List<String> list = Stream.of("1, 2, 3").collect(Collectors.toList()); 

Aber nicht zur Liste der Ints.

Irgendwelche Ideen?

+4

Ihre letzte Zeile des Codes wird Ihnen eine Liste mit genau einem String geben, mit dem Wert "1, 2, 3". Meinst du: 'Stream.of (" 1 "," 2 "," 3 ")'? – Jesper

Antwort

17

Sie müssen die Zeichenfolge aufgeteilt und einen Strom aus jedem Teil zu machen. Das Verfahren splitAsStream(input) tut genau das:

Pattern pattern = Pattern.compile(", "); 
List<Integer> list = pattern.splitAsStream(ints) 
          .map(Integer::valueOf) 
          .collect(Collectors.toList()); 

Es gibt eine Stream<String> des Teils der Eingabezeichenfolge, die Sie später zu einem Integer und sammeln in eine Liste zuordnen.

Beachten Sie, dass Sie das Muster möglicherweise in einer Konstanten speichern und jedes Mal erneut verwenden möchten, wenn es benötigt wird.

+2

@Igor Es gibt wirklich keinen Gewinner, nur andere Lösungen, um die Aufgabe zu erledigen. Erstellen Sie ein Array und übergeben Sie es an Stream.von Werken auch, und abhängig von den Strings, die Sie analysieren wollen, und dem genauen Begrenzer (wenn es nicht "", "") ist, ist diese Lösung mit 'splitAsStream' möglicherweise schneller als die andere. Dies muss gemessen werden. – Tunaki

+4

Ich würde diese über meine vorziehen. War sich der 'Pattern.splitAsStream()' Methode nicht bewusst. Ausgezeichnet! –

+6

Sie können 'Pattern.compile (", ", Pattern.LITERAL);' verwenden, um auf die Engine hinzuweisen, dass keine echte Mustererkennung vorhanden ist. Natürlich wird die Engine selbst ohne das Flag herausfinden, aber das Spezifizieren des Flags überspringt den Prozess des Analysierens des Musters. – Holger

14

Regulärer Ausdruck Spaltung ist das, was Sie suchen

Stream.of(ints.split(", ")) 
     .map(Integer::parseInt) 
     .collect(Collectors.toList()); 
+0

Ja, aber er fragte speziell nach Java8 Weg, um dies zu lösen –

+0

Das wird keine Liste erstellen Rainer

+5

Ich empfehle immer 'Arrays.stream' zu verwenden, wenn die Eingabe ein Array ist, d.h. wenn es keinen echten Varargs Aufruf gibt. Dadurch wird deutlich, dass wir über ein Array streamen und ordnungsgemäß für Arrays primitiver Typen arbeiten, anstatt einen einzelnen Elementstream zu erstellen. In diesem speziellen Fall werden beide dasselbe tun. – Holger

2

Zuerst teilen Sie die Zeichenfolge in einzelne Zahlen, dann konvertieren Sie diese (noch Zeichenfolge) in tatsächliche Ganzzahlen und schließlich sammeln Sie sie in einer Liste. Sie können all dies tun, indem Sie Stream-Operationen verketten.

String ints = "1, 2, 3"; 
List<Integer> intList = Stream 
     .of(ints.split(", ")) 
     .map(Integer::valueOf) 
     .collect(Collectors.toList()); 
System.out.println(intList); // [1, 2, 3] 
0

Sie können nur die Funktion Array asList, verwenden und dann die java8 Art und Weise umzusetzen.

Vergessen Sie nicht, die Leerräume zu entfernen.

List<Integer> erg = Arrays.asList(ints.replace(" ", "").split(",")).stream().map(Integer::parseInt).collect(Collectors.toList()); 

EDIT: Leider habe ich nicht sehen, dass es eine einzelne Saite war, hielt es für eine Reihe von String war.