2015-03-12 29 views
5

Tôi có một danh sách các đối tượng như thế này:Java 8 bản đồ của danh sách dòng

[ 
    {value: 1, tag: a}, 
    {value: 2, tag: a}, 
    {value: 3, tag: b}, 
    {value: 4, tag: b}, 
    {value: 5, tag: c}, 
] 

nơi mọi đối tượng của nó là một thể hiện của một lớp Entry, trong đó có tagvalue như tài sản. Tôi muốn nhóm chúng theo cách này:

{ 
    a: [1, 2], 
    b: [3, 4], 
    c: [5], 
} 

Đây là những gì tôi đã thực hiện cho đến nay:

List<Entry> entries = <read from a file> 

Map<String, List<Entry>> map = entries.stream() 
    .collect(Collectors.groupingBy(Entry::getTag, LinkedHashMap::new, toList())); 

Và đây là kết quả của tôi (không phải những gì tôi muốn):

{ 
    a: [{value: 1, tag: a}, {value: 2, tag: a}], 
    b: [{value: 3, tag: b}, {value: 4, tag: b}], 
    c: [{value: 5, tag: c}], 
} 

Nói cách khác, tôi muốn danh sách các chuỗi dưới dạng giá trị của ánh xạ mới của tôi (Map<String, List<String>>) và không phải danh sách các đối tượng (Map<String, List<Entry>>). Làm thế nào tôi có thể đạt được điều này với Java 8 tính năng mới thú vị?

Trả lời

9

Sử dụng mapping:

Map<String, List<String>> map = 
    entries.stream() 
     .collect(Collectors.groupingBy(Entry::getTag, 
             Collectors.mapping(Entry::getValue, toList()))); 
+0

cảm ơn bạn :) nó làm việc – Oneiros

Các vấn đề liên quan