जावा 8: स्ट्रीम एपीआई के साथ सूचियों को मर्ज करें


80

मेरी निम्नलिखित स्थिति है

Map<Key, ListContainer> map; 

public class ListContainer{
  List<AClass> lst;
}

मुझे सभी सूचियों lstको मानचित्र ListContainerसे वस्तुओं से मिलाना है Map

public static void main(String args[]){
   List<AClass> alltheObjectsAClass = map.values().stream(). // continue....    
}

किसी भी विचार कैसे, जावा 8 स्ट्रीम एपीआई का उपयोग कर?


क्या आप एक उदाहरण प्रदान कर सकते हैं कि विलय के साथ आपका क्या मतलब है? अपना मानचित्र बताएं {a: [1,2], b[3,4]}, क्या आप उन्हें श्रृंखलाबद्ध करना चाहते हैं, जैसे [1,2,3,4], या सूची की सूची बनाना [[1,2],[3,4]], या उन्हें ज़िप करना [[1,3],[2,4]]? इसके अलावा, आप जानते हैं कि मानचित्र में कोई आदेश नहीं है, क्या आप हैं?
तोबियस_क

@tobias_k मैं चाहता हूं कि परिणाम अनसोल्ड रहे [1,2,3,4]!
mat_boy

यदि ListContainerकेवल एक लपेटता List<T>तो आप जगह ले सकता है Map<Key, ListContainer>के साथMap<Key, List<T>>
ThePyroEagle

जवाबों:


169

मुझे लगता flatMap()है कि तुम क्या देख रहे हो।

उदाहरण के लिए:

 List<AClass> allTheObjects = map.values()
         .stream()
         .flatMap(listContainer -> listContainer.lst.stream())
         .collect(Collectors.toList());

2
? उन टिप्पणियों को क्यों हटाया गया, जो बताती हैं कि .flatMap(Collection::stream)यहां क्यों संभव नहीं है?
पूस

अच्छा सवाल @Puce, लेकिन यह संभव तरह-की है: यदि ListContainer(यानी के लिए एक गेटर है समझाया गया है lst), तो आप विघटित कर सकते हैं .flatMap(->)में.map(ListContainer::getLst) .flatMap(Collection::stream)
TWiStErRob

3
@TWiStErRob हाँ, यही मैंने अपनी मूल टिप्पणी में लिखा है। इसे क्यों हटाया गया?
puce

@ अपने उत्तर में एक नोट बताएं कि यह क्यों .flatMap(Collection::stream)संभव नहीं है बेहतर होगा, मुझे लगता है। अधिक स्थायी होना चाहिए।
एसक्यूबी

1
@ एलेक्स हां, यह एक तरह से सम्मान है। .map(listContainer -> listContainer.lst).filter(Objects::nonNull).flatMap(Collection::stream)
स्यूस


2

जावा 8 में हम स्ट्रीम1.स्ट्रीम () का उपयोग कर सकते हैं। कलेक्ट (कलेक्टर्स.ल्टलिस्ट ())। ऐडऑल (लिस्ट 2); एक अन्य विकल्प List1.addAll (List2)


1

पहले से ही ऊपर वर्णित है, लेकिन यहां एक और दृष्टिकोण आप ले सकते हैं। मुझे वह मूल पोस्ट नहीं मिली, जिसे मैंने इससे अनुकूलित किया था, लेकिन यहाँ आपके प्रश्न के लिए कोड है। जैसा कि ऊपर उल्लेख किया गया है, फ्लैटपाइप () फ़ंक्शन वह है जिसे आप जावा 8 के साथ उपयोग करना चाह रहे हैं। आप इसे एक उपयोगिता वर्ग में फेंक सकते हैं और बस "रैंडम यूटिल्स डॉट कॉम (सूची 1, सूची 2, ...)" कह सकते हैं। और आपको सभी मानों के साथ एकल सूची मिलेगी। बस वाइल्डकार्ड के साथ सावधान रहें - यदि आप कम सामान्य विधि चाहते हैं तो आप इसे बदल सकते हैं। आप इसे सेट्स के लिए भी संशोधित कर सकते हैं - सेट इंटरफ़ेस की प्रकृति के कारण समतुल्य / हैशकोड विधियों से डेटा हानि से बचने के लिए आपको केवल सेट पर फ्लैटपाइप () का उपयोग करते समय ध्यान रखना होगा।

  /**
    * Combines multiple lists into a single list containing all elements of
    * every list.
    * 
    * @param <T> - The type of the lists.
    * @param lists - The group of List implementations to combine
    * @return a single List<?> containing all elements of the passed in lists.
    */
   public static <T> List<?> combine(final List<?>... lists) {
      return Stream.of(lists).flatMap(List::stream).collect(Collectors.toList());
   }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.