java 8 map,按Java 8中的Map列表分组

I have a List like this:

List>

Is there a way, using lambda, to convert this list to:

Map>

Example:

Map m1 = new HashMap<>();

m1.put("A", 1);

m1.put("B", 100);

Map m2 = new HashMap<>();

m2.put("A", 10);

m2.put("B", 20);

m2.put("C", 100);

List> beforeFormatting = new ArrayList<>();

beforeFormatting.add(m1);

beforeFormatting.add(m2);

After formatting:

Map> afterFormatting;

which would look like:

A -> [1, 10]

B -> [100, 20]

C -> [100]

解决方案

You need to flatMap the entry set of each Map to create a Stream>. Then, this Stream can be collected with the groupingBy(classifier, downstream) collector: the classifier returns the key of the entry and the downstream collector maps the entry to its value and collects that into a List.

Map> map =

list.stream()

.flatMap(m -> m.entrySet().stream())

.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));

This code needs the following static imports:

import static java.util.stream.Collectors.groupingBy;

import static java.util.stream.Collectors.mapping;

import static java.util.stream.Collectors.toList;

With your full example:

public static void main(String[] args) {

Map m1 = new HashMap<>();

m1.put("A", 1l);

m1.put("B", 100l);

Map m2 = new HashMap<>();

m2.put("A", 10l);

m2.put("B", 20l);

m2.put("C", 100l);

List> beforeFormatting = new ArrayList<>();

beforeFormatting.add(m1);

beforeFormatting.add(m2);

Map> afterFormatting =

beforeFormatting.stream()

.flatMap(m -> m.entrySet().stream())

.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));

System.out.println(afterFormatting); // prints {A=[1, 10], B=[100, 20], C=[100]}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值