gpt4 book ai didi

java - 分组对象java 8

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:30 30 4
gpt4 key购买 nike

我有类似下面的内容:

public class MyClass {
private Long stackId
private Long questionId
}

例如 100 个的集合,其中 stackid 可以与不同的 questionId 重复。 stackId和questionId是一对多的关系

是否有streamy,java 8 方法转换为以下结构:

public class MyOtherClass {
private Long stackId
private Collection<Long> questionIds
}

这将是一个包含 25 个问题的集合,每个实例都有一个包含 4 个问题 ID 的嵌套集合。

输入:

[{1,100},{1,101},{1,102},{1,103},{2,200},{2,201},{2,202},{1,203}]

输出

[{1, [100,101,102,103]},{2,[200,201,202,203]}]

最佳答案

使用 Stream API 的直接方法涉及 2 个 Stream 管道:

  • 第一个创建临时 Map<Long, List<Long>>stackIdquestionIds .这是通过 groupingBy(classifier, downstream) 完成的我们根据 stackId 分类的 Collection 家和值具有相同的 stackId映射到他们的 questionId (使用 mapping )并使用 toList() 收集到列表中.
  • 第二个将该映射的每个条目转换为 MyOtherClass实例并将其收集到列表中。

假设你有一个构造函数 MyOtherClass(Long stackId, Collection<Long> questionIds) ,示例代码为:

Map<Long, List<Long>> map = 
list.stream()
.collect(Collectors.groupingBy(
MyClass::getStackId,
Collectors.mapping(MyClass::getQuestionId, Collectors.toList())
));

List<MyOtherClass> result =
map.entrySet()
.stream()
.map(e -> new MyOtherClass(e.getKey(), e.getValue()))
.collect(Collectors.toList());

使用 StreamEx库,您可以在单个 Stream 管道中执行此操作。这个图书馆提供了一个 pairing first Collection 家。这使得能够配对两个收集器并对两个收集的结果执行整理操作:

  • 第一个只保留第一个stackId分组元素的数量(根据构造,它们都是相同的)
  • 第二个将每个元素映射到它们的 questionId并收集到列表中。
  • finisher 操作只返回 MyOtherClass 的一个新实例.

示例代码:

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;
import static one.util.streamex.MoreCollectors.first;
import static one.util.streamex.MoreCollectors.pairing;

// ...

Collection<MyOtherClass> result =
StreamEx.of(list)
.groupingBy(
MyClass::getStackId,
pairing(
collectingAndThen(mapping(MyClass::getStackId, first()), Optional::get),
mapping(MyClass::getQuestionId, toList()),
MyOtherClass::new
)
).values();

关于java - 分组对象java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36444839/

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