2015-03-12 2 views
5

У меня есть список объектов, как это:Java 8 отображение списка потока

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

, где каждый объект этого является экземпляром класса Entry, который имеет tag и value как свойства. Я хочу, чтобы сгруппировать их следующим образом:

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

Это то, что я сделал до сих пор:

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

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

И это мой результат (а не то, что я хотел):

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

Другими словами, мне нужен список строк в качестве значений моего нового сопоставления (Map<String, List<String>>), а не список объектов (Map<String, List<Entry>>). Как я могу достичь этого с помощью Java 8 новых интересных функций?

ответ

9

Использование mapping:

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

спасибо :) она работала – Oneiros