gpt4 book ai didi

Java List 到 Map> 的键是 E 的某些属性,值是具有该属性的 E

转载 作者:行者123 更新时间:2023-11-30 05:45:16 30 4
gpt4 key购买 nike

我想知道如何将 Java List 转换为 Map。映射中的键是列表元素的某些属性(不同的元素可能具有相同的属性),值是这些列表项的列表(具有相同的属性)。例如。 List<Owner> --> Map<Item, List<Owner>> 。我找到了几个ListMap问题,但这不是我想做的。

我带来的是:

    List<Owner> owners = new ArrayList<>(); // populate from file

Map<Item, List<Owner>> map = new HashMap<>();

owners.parallelStream()
.map(Owner::getPairStream)
.flatMap(Function.identity())
.forEach(pair -> {
map.computeIfPresent(pair.getItem(), (k,v)-> {
v.add(pair.getOwner());
return v;
});
map.computeIfAbsent(pair.getItem(), (k) -> {
List<Owner> list = new ArrayList<>();
list.add(pair.getOwner());
return list;
});
});

PasteBin

我可以输入forEach部分到一个单独的方法,但它仍然感觉太冗长了。另外我做了一个Pair类只是为了让它发挥作用。我试图查看 Collectors但无法集中精力做我想做的事。

最佳答案

从这里开始,您可以使用 groupingBy 来简化代码:

Map<Item, List<Owner>> map = owners.stream()
.flatMap(Owner::getPairStream)
.collect(Collectors.groupingBy(Pair::getItem,
Collectors.mapping(Pair::getOwner,
Collectors.toList())));

您还可以使用 SimpleEntry 省去 Pair 类:

Map<Item, List<Owner>> map = owners.stream()
.flatMap(owner -> owner.getItems()
.stream()
.map(item -> new AbstractMap.SimpleEntry<>(item, owner)))
.collect(Collectors.groupingBy(Entry::getKey,
Collectors.mapping(Entry::getValue,
Collectors.toList())));

请注意,我假设 Item 已相应地覆盖 equalshashCode

旁注:

  • 您可以使用 map.merge 而不是连续调用 map.computeIfPresentmap.computeIfAbsent
  • HashMapparallelStream 是一个糟糕的组合(HashMap 不是线程安全的)

关于Java List<E> 到 Map<P, List<E>> 的键是 E 的某些属性,值是具有该属性的 E,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54960666/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com