2017-05-29 21 views
6

Próbowałem ten kod (list jest ArrayList<List<Integer>>):Jak przekonwertować listę 2D na listę 1D za pomocą strumieni?

list.stream().flatMap(Stream::of).collect(Collectors.toList()); 

ale nic nie robi; lista wciąż jest listą 2D. Jak mogę przekonwertować tę listę 2D na listę 1D?

+1

użyć 'flatMap (strumień -> stream) 'zamiast tego. –

+0

To zadziałało. '.flatMap (l -> l.stream())'. Dlaczego to działa, ale 'Stream :: of' nie działa? –

+1

'Stream.of' _adds_ a dimension. –

Odpowiedz

6

dlatego że jesteś nadal otrzymuje listę list dlatego podczas stosowania Stream::of to powrót nowy strumień istniejące.

To jest podczas wykonywania Stream::of To tak, jakby {{{1,2}}, {{3,4}}, {{5,6}}} następnie podczas wykonywania flatMap to jak to zrobić:

{{{1,2}}, {{3,4}}, {{5,6}}} -> flatMap -> {{1,2}, {3,4}, {5,6}} 
// result after flatMap removes the stream of streams of streams to stream of streams 

raczej można użyć .flatMap(Collection::stream) wziąć strumień strumieni, takich jak:

{{1,2}, {3,4}, {5,6}} 

i zmień na:

{1,2,3,4,5,6} 

Dlatego można zmienić aktualny rozwiązanie:

List<Integer> result = list.stream().flatMap(Collection::stream) 
          .collect(Collectors.toList()); 
1

Możesz użyć x.stream() w swoim flatMap. Coś podobnego,

ArrayList<List<Integer>> list = new ArrayList<>(); 
list.add(Arrays.asList((Integer) 1, 2, 3)); 
list.add(Arrays.asList((Integer) 4, 5, 6)); 
List<Integer> merged = list.stream().flatMap(x -> x.stream()) 
     .collect(Collectors.toList()); 
System.out.println(merged); 

które wyjścia (jak myślę, że chciał)

[1, 2, 3, 4, 5, 6] 
2

Prostym rozwiązaniem jest:

List<List<Integer>> listOfLists = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4)); 
List<Integer> faltList = listOfLists. 
     stream().flatMap(s -> s.stream()).collect(Collectors.toList()); 
System.out.println(faltList); 

Odpowiedź: [1, 2, 3, 4]

Nadzieja to pomaga

Powiązane problemy