java8 stream多次map_Java 8 Stream API:如何将List转换为List中具有重复键的Map?

我有一个包含以下字段的类:

public class Item{

private String name;

private Long category;

private Set containers;

}

我需要做的是转一个

列表与LT;项目&GT项目

进入

Map< Long / * categoryID * /,Set< Long / * Containers * />>

使用Java 8 Stream API.

现在我可以使用Itarable和一些if得到相同的结果,如下所示:

List items = getItems();

Iterator itemsIterator = items.iterator();

Map> containersByCategoryMap = new HashMap<>();

while (itemsIterator.hasNext()) {

Item item = itemsIterator.next();

Long category = item.getCategory();

Set containers = item.getContainers();

if (containersByCategoryMap.containsKey(category)) {

Set containersByCategory = containersByCategoryMap.get(category);

containersByCategory.addAll(containers);

} else {

Set containersByCategory = new HashSet<>(containers);

containersByCategoryMap.put(category, containersByCategory);

}

}

如何使用Stream API获得相同的结果?

我试过这样的东西,但显然我得到了重复的密钥异常,因为每个类别有多个项目……

containersByCategoryMap = items.stream().collect(Collectors.toMap(item -> item.getCategory(), item -> item.getContainers()));

解决方法:

由于java-9有Collectors.flatMapping:

Map> map = items.stream()

.collect(Collectors.groupingBy(

Item::getCategory,

Collectors.flatMapping(x -> x.getContainers().stream(), Collectors.toSet())));

没有java-9,你可以这样做:

Map> result = items.stream()

.flatMap(x -> x.getContainers().stream().map(y -> new SimpleEntry<>(x.getCategory(), y)))

.collect(Collectors.groupingBy(

Entry::getKey,

Collectors.mapping(Entry::getValue, Collectors.toSet())));

您也可以使用Map#merge执行此操作:

Map> map2 = new HashMap<>();

items.forEach(x -> map2.merge(

x.getCategory(),

x.getContainers(),

(left, right) -> {

left.addAll(right);

return left;

}));

标签:java,java-8,java-stream,list,dictionary

来源: https://codeday.me/bug/20190828/1746621.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值