2016-11-29 20 views
8

mam wyrażenie:Java 8 nawrócony Ciąg wskazówki do listy <Integer>

String ints = "1, 2, 3"; 

chciałbym, aby przekształcić go do listy wskazówki:

List<Integer> intList 

jestem w stanie przekształcić go lista łańcuchów w ten sposób:

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

Ale nie na liście ints.

Wszelkie pomysły?

+4

Twoja ostatnia linijka kodu wyświetli listę z dokładnie jednym ciągiem, o wartości '" 1, 2, 3 "'. Czy miałeś na myśli: 'Stream.of (" 1 "," 2 "," 3 ")'? – Jesper

Odpowiedz

17

musisz podzielić ciąg i zrobić Stream z każdej części. Metoda splitAsStream(input) robi dokładnie to:

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

Zwraca Stream<String> części łańcucha wejściowego, które można później map do Integer i zebrać do listy.

Pamiętaj, że możesz chcieć zapisać wzór w stałej i użyć go ponownie za każdym razem, gdy jest potrzebny.

+2

@Igor Nie ma naprawdę zwycięzcy, tylko różne rozwiązania do wykonania zadania. Tworzenie tablicy i przekazywanie jej do strumienia.również w przypadku utworów i zależnie od ciągów, które chcesz analizować, oraz dokładnego separatora (jeśli nie jest to "", "'), może to rozwiązanie z 'splitAsStream' będzie szybsze niż inne. To należy zmierzyć. – Tunaki

+4

Wolę ten jeden od mojego. Nie był świadomy metody 'Pattern.splitAsStream()'. Doskonały! –

+6

Możesz użyć 'Pattern.compile (", ", Pattern.LITERAL);' aby wskazać silnikowi, że nie ma rzeczywistego dopasowania wzorca. Oczywiście silnik sam znajdzie się bez flagi, ale podanie flagi pominie proces analizy wzoru. – Holger

14

Regularne dzielenie wyrazem jest to, czego szukasz

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

Tak, ale specjalnie poprosił o sposób, aby rozwiązać ten problem w języku Java8. –

+0

To nie tworzy listy Rainer

+5

Zawsze polecam używać 'Arrays.stream', jeśli dane wejściowe są tablicą, tj. Gdy nie ma prawdziwego wywołania varargs. Dzięki temu stajemy się jasne, że przesyłamy strumień przez tablicę i działamy poprawnie dla tablic typów pierwotnych, zamiast tworzyć strumień pojedynczego elementu. W tym konkretnym przypadku obie będą robić to samo. – Holger

2

Najpierw podziel łańcuch na pojedyncze liczby, a następnie przekonwertuj te (ciąg znaków) na rzeczywiste liczby całkowite, a na koniec odbierz je na liście. Możesz to wszystko zrobić, używając łańcuchów operacji strumieniowych.

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

Możesz po prostu użyć funkcji Array asList, a następnie przekonwertować ją na sposób java8.

Nie zapomnij usunąć białych spacji.

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

EDIT: Niestety nie widzę, że był to pojedynczy łańcuch, myślał, że to tablica String.

Powiązane problemy