2017-05-29 5 views
6

मैं इस कोड की कोशिश की है (listArrayList<List<Integer>> है):स्ट्रीम के साथ 2 डी सूची में 1 डी सूची को कैसे परिवर्तित करें?

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

लेकिन यह कुछ भी नहीं है; सूची अभी भी एक 2 डी सूची है। मैं इस 2 डी सूची को 1 डी सूची में कैसे परिवर्तित कर सकता हूं?

+1

उपयोग 'flatMap (धारा में मदद करता है -> स्ट्रीम) 'इसके बजाए। –

+0

यह काम किया। '.flatMap (एल -> एल। स्ट्रीम())'। यह क्यों काम करता है, लेकिन 'स्ट्रीम :: का' नहीं है? –

+1

'Stream.of' _adds_ एक आयाम। –

उत्तर

6

कारण किया जा रहा है कि आप अभी भी सूचियों की एक सूची प्राप्त कर रहे हैं है, क्योंकि जब आप Stream::of लागू यह की एक नई धारा लौटा रहा है मौजूदा वाले

कि है जब आप Stream::of प्रदर्शन यह {{{1,2}}, {{3,4}}, {{5,6}}} तो होने की तरह है जब आप प्रदर्शन flatMap यह ऐसा करने की तरह है:

{{{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 

बल्कि आप .flatMap(Collection::stream) उपयोग कर सकते हैं जैसे धाराओं की एक धारा लेने के लिए:

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

और इसे चालू करें:

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

इसलिए, आप के लिए अपने वर्तमान समाधान बदल सकते हैं:

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

आप अपने flatMap में x.stream() का उपयोग कर सकते हैं। कुछ की तरह,

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); 

कौन सा आउटपुट (जैसे मुझे लगता है कि आप चाहते थे)

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

सरल समाधान है:

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); 

उत्तर: [1, 2, 3, 4]

आशा यह आप

संबंधित मुद्दे