列表流的Java 8映射

One*_*ros 5 java java-8 java-stream collectors

我有一个像这样的对象列表:

[
    {value: 1, tag: a},
    {value: 2, tag: a},
    {value: 3, tag: b},
    {value: 4, tag: b},
    {value: 5, tag: c},
]
Run Code Online (Sandbox Code Playgroud)

其中每个对象都是一个类的实例Entry,它具有tagvalue作为属性.我想以这种方式对它们进行分组:

{
    a: [1, 2],
    b: [3, 4],
    c: [5],
}
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所做的:

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

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

这是我的结果(不是我想要的):

{
    a: [{value: 1, tag: a}, {value: 2, tag: a}],
    b: [{value: 3, tag: b}, {value: 4, tag: b}],
    c: [{value: 5, tag: c}],
}
Run Code Online (Sandbox Code Playgroud)

换句话说,我想要一个字符串列表作为我的新映射(Map<String, List<String>>)的值,而不是一个对象列表(Map<String, List<Entry>>).如何使用Java 8新的酷炫功能实现这一目标?

Era*_*ran 10

用途mapping:

Map<String, List<String>> map = 
  entries.stream()
         .collect(Collectors.groupingBy(Entry::getTag, 
                                        Collectors.mapping(Entry::getValue, toList())));
Run Code Online (Sandbox Code Playgroud)