Java 8列表流的映射

5

我有一个对象列表,类似于这样:

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

每个对象都是类Entry的实例,它具有tagvalue属性。我希望按照以下方式对它们进行分组:

{
    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的新功能实现这一点?
1个回答

10

使用 mapping

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接