मैं इस सरल बीन वर्ग है:एक सूची का मिलान जावा मानचित्र 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())));
,:
बिल्कुल सही! यह काम। – daman