Java 8 列表流的映射
Java 8 mapping of list stream
我有一个这样的对象列表:
[
{value: 1, tag: a},
{value: 2, tag: a},
{value: 3, tag: b},
{value: 4, tag: b},
{value: 5, tag: c},
]
其中每个对象都是 class 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 个很酷的新功能实现这一目标?
使用mapping
:
Map<String, List<String>> map =
entries.stream()
.collect(Collectors.groupingBy(Entry::getTag,
Collectors.mapping(Entry::getValue, toList())));
我有一个这样的对象列表:
[
{value: 1, tag: a},
{value: 2, tag: a},
{value: 3, tag: b},
{value: 4, tag: b},
{value: 5, tag: c},
]
其中每个对象都是 class 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 个很酷的新功能实现这一目标?
使用mapping
:
Map<String, List<String>> map =
entries.stream()
.collect(Collectors.groupingBy(Entry::getTag,
Collectors.mapping(Entry::getValue, toList())));