gpt4 book ai didi

java-8 - 映射到多个键的 Java 8 Stream "collect and group by"对象

转载 作者:行者123 更新时间:2023-12-04 09:14:00 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Java 8 grouping by from one-to-many

(4 个回答)


5年前关闭。




我有以下对象:

public class Item {
String value;
List<Person> owners;
Person creator;
}

public class Person {
String name;
int id;
Person manager;
}

现在我有一个包含 3 个 Item 对象的列表:
i1 -> {value="1", owners=[p1, p2, p3], creator=p4}
i2 -> {value="2", owners=[p2, p3], creator=p5}
i3 -> {value="3", owners=[p5], creator=p1}

Person 对象如下:
p1 -> {manager=m1, ...}
p2 -> {manager=m2, ...}
p3 -> {manager=m3, ...}
p4 -> {manager=m2, ...}
p5 -> {manager=m1, ...}

我想根据所有者和创建者的经理对 Item 对象流进行分组。结果 Map<Person, List<Item>>应该看起来像:
{
m1: [i1, i2, i3],
m2: [i1, i2],
m3: [i1, i2]
}

我认为使用 Stream 和 Collector API,我可以制作从 Item 到 Manager 的映射, Map<Item, List<Person>>首先,然后反转映射。但是有什么方法可以只使用 Stream 和 Collectors 来制作我想要的映射吗?

最佳答案

我认为,这只能通过中间的“对”值来记住人员/经理与原始项目之间的关联。由于 Java 的标准 API 中没有标准对类型,我们不得不求助于 Map.Entry最接近 Pair类型:

Map<Person, List<Item>> map = list.stream()
.flatMap(item->item.getOwners().stream()
.map(p->new AbstractMap.SimpleEntry<>(p.getManager(), item)))
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

使用 import static 改进后我们得到
Map<Person, List<Item>> map = list.stream()
.flatMap(item->item.getOwners().stream().map(p->new SimpleEntry<>(p.getManager(), item)))
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));

它导致

m1: [i1,i3]
m3: [i1,i2]
m2: [i1,i2]

这是不同的,因为首先,标准 map 没有定义的顺序,其次,我认为你把你的期望误认为 m1i2 无关在您的示例数据中。

关于java-8 - 映射到多个键的 Java 8 Stream "collect and group by"对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33086686/

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