2016-04-13 4 views
5

मैं जावा 8 स्ट्रीम से निपट रहा हूं और मुझे आश्चर्य है कि क्या मैं इस समस्या को एक फैंसी तरीके से हल कर सकता हूं।स्ट्रीम और फ्लैटमैप्स के माध्यम से ऑब्जेक्ट पास करना

यह मेरा परिदृश्य है: मान लीजिए कि मेरे पास पार्टियों की एक सूची है और प्रत्येक तत्व के अंदर मेरे सदस्यों के नाम हैं। मैं सूची में पुन: प्रयास करना चाहता हूं और नामों के साथ एक नया खाता बनाना चाहता हूं और वे किस पार्टी से संबंधित हैं।

मेरा पहला दृष्टिकोण था:

@Test 
public void test(){ 

    Party firstParties = new Party("firstParty",Lists.newArrayList("Member 1","Member 2","Member 3")); 
    Party secondParty = new Party("secondParty",Lists.newArrayList("Member 4","Member 5","Member 6")); 

    List<Party> listOfParties = Lists.newArrayList(); 
    listOfParties.add(firstParty); 
    listOfParties.add(secondParty); 

    List<Elector> electors = new ArrayList<>(); 
    listOfParties.stream().forEach(party -> 
     party.getMembers().forEach(memberName -> 
      electors.add(new Elector(memberName,party.name)) 
     ) 
    ); 

} 

class Party { 
    List<String> members = Lists.newArrayList(); 
    String name = ""; 

    public Party(String name, List<String> members) { 
     this.members = members; 
     this.name = name; 
    } 

    public List<String> getMembers() { 
     return members; 
    } 
} 

class Elector{ 

    public Elector(String electorName,String partyName) { 

    } 

} 

मेरी दूसरी दृष्टिकोण में मैं का उपयोग करने की कोशिश की नक्शे एक flatmap के संचालन:

@Test 
public void test(){ 

    Party firstParty = new Party("firstParty",Lists.newArrayList("Member 1","Member 2","Member 3")); 
    Party secondParty = new Party("secondParty",Lists.newArrayList("Member 4","Member 5","Member 6")); 

    List<Party> listOfParties = Lists.newArrayList(); 
    listOfParties.add(firstParty); 
    listOfParties.add(secondParty); 

    List<Elector> people = listOfParties.stream().map(party -> party.getMembers()) 
      .flatMap(members -> members.stream()) 
      .map(membersName -> new Elector(membersName, party.name)) #Here is my problem variable map doesn't exist 
      .collect(Collectors.toList()); 

} 

समस्या मैं अंदर पार्टी वस्तु के लिए उपयोग नहीं कर सकते है नक्शा ऑपरेशन तो सवाल फिर से है क्या मैं एक और अधिक कार्यात्मक तरीके से कर सकता हूं? (दूसरे दृष्टिकोण की तरह)

धन्यवाद!

+0

हां, हैक टुपल की धारा में फ्लैटमैप करना है, जिसमें सदस्य और उसकी पार्टी शामिल होगी। कुछ '.flatMap (पार्टी -> party.getMembers()। स्ट्रीम()। नक्शा (सदस्य -> ​​नया टुपल <> (पार्टी, सदस्य))'। और चूंकि कोई अंतर्निहित टुपल क्लास नहीं है, तो आप इसे बना सकते हैं यदि आप पहले से ही निर्भरता रखते हैं तो अपने स्वयं के या (एबी) 'AbstractMap.SimpleEntry' ... – Tunaki

+0

या' Pair.of (पार्टी, सदस्य) 'का उपयोग करें। –

+2

@ टुनकी: आप बहुत जटिल सोच रहे हैं ... – Holger

उत्तर

5

आप अलग-अलग संचालन में बहुत ज्यादा विघटित:

List<Elector> people = listOfParties.stream() 
    .flatMap(party -> party.getMembers().stream() 
     .map(membersName -> new Elector(membersName, party.name))) 
    .collect(Collectors.toList()); 

यह flatMap कदम है, जहां केवल एक दूसरे बचता में दोनों map चरणों को ले जाकर काम करता है, अब लौट आए "substream" के लिए लागू किया जा रहा है। जैसा कि आपके प्रश्न की टिप्पणियों में बताया गया है, आपको "substream" तत्वों को मैप करने के लिए किसी प्रकार के Pair प्रकार की आवश्यकता है, लेकिन आपका Elector प्रकार ठीक से पूरा करता है, क्योंकि यह आपके द्वारा रुचि रखने वाले दो मूल्यों का उपयोग करके बनाया गया है। तो वहां है बाद में Elector पर मानचित्र करने के लिए सामान्य जेनर Pair(member,party) पर मानचित्र करने की आवश्यकता नहीं है।

2

सब कुछ पठनीय मैं Party वर्ग में एक सहायक विधि (या एक स्थिर विधि कहीं और) जोड़ने पाने के लिए चाहते हैं रखने के लिए एक Stream<Elector>:

public Stream<Elector> electors() { 
    return getMembers().stream().map(member -> new Elector(member, name)); 
} 
// Alternatively 
public static Stream<Elector> electors(final Party p) { 
    return p.getMembers().stream().map(member -> new Elector(member, p.name)); 
} 

और फिर बस का उपयोग करें कि आपके flatmap में

final List<Elector> people = listOfParties.stream() 
    .flatMap(Party::electors) 
    .collect(Collectors.toList()); 
संबंधित मुद्दे

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