2015-06-16 24 views
7

मैं इस सरल बीन वर्ग है:एक सूची का मिलान जावा मानचित्र 8 स्ट्रीम और groupingBy

Map<String, String> book1Details = new HashMap<String, String>(); 
    book1Details.put("1234", "author1"); 
    book1Details.put("5678", "author2"); 
    Book book1 = new Book(book1Details); 

    Map<String, String> book2Details = new HashMap<String, String>(); 
    book2Details.put("1234", "author2"); 
    Book book2 = new Book(book2Details); 

    List<Book> books = new ArrayList<Book>(); 
    books.add(book1); 
    books.add(book2); 

अब मैं:

public class Book {  

public Book(Map<String, String> attribute) { 
    super(); 
    this.attribute = attribute; 
} 
//key is isbn, val is author 
private Map<String, String> attribute; 

public Map<String, String> getAttribute() { 
    return attribute; 
} 
public void setAttribute(Map<String, String> attribute) { 
    this.attribute = attribute; 
} 

} 

अपने मुख्य वर्ग में, मैं सूची के लिए कुछ जानकारी जोड़ लिया है

Map<String, List<String>> 

ताकि उत्पादन (ऊपर नक्शा) की तरह है:: इस फार्म के मानचित्र के लिए पुस्तकों की सूची में परिवर्तित करना चाहते

//isbn: value1, value2 
1234: author1, author2 
5678: author1 

तो, मुझे आईएसबीएन द्वारा एएसबीएन द्वारा प्रविष्टियों को मूल्यों और लेखकों के रूप में समूहित करने की आवश्यकता है। एक आईएसबीएन में कई लेखक हो सकते हैं।

मैं नीचे की तरह कोशिश कर रहा हूँ:

Map<String, List<String>> library = books.stream().collect(Collectors.groupingBy(Book::getAttribute)); 

सेम का स्वरूप बदला नहीं जा सकता। यदि बीन के मानचित्र के बजाय स्ट्रिंग मान थे, तो मैं इसे करने में सक्षम हूं, लेकिन मानचित्र के साथ अटक गया हूं।

मैंने पारंपरिक जावा 6/7 तरीके से इसे सही तरीके से करने के लिए लिखा है, लेकिन जावा 8 नई सुविधाओं के माध्यम से इसे करने का प्रयास किया है। मदद की सराहना करें। प्रत्येक नक्शे इसमें इतना है कि आप एक Stream<Entry<String, String>> है की धारा के साथ फ्लैट नक्शा यह Stream<Book> से

Map<String, List<String>> library = 
    books.stream() 
     .flatMap(b -> b.getAttribute().entrySet().stream()) 
     .collect(groupingBy(Map.Entry::getKey, 
          mapping(Map.Entry::getValue, toList()))); 

,:

उत्तर

9

आप इस तरह यह कर सकता है। वहां से आप प्रविष्टियों की कुंजी द्वारा तत्वों को समूहित करते हैं और प्रत्येक प्रविष्टि को उसके मान पर मैप करते हैं जिसे आप मानों के लिए सूची में एकत्र करते हैं।

+0

बिल्कुल सही! यह काम। – daman

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