Java 如何处理结果列表<;T>;同一个'stream()'中'groupingBy'的值?
简要说明:返回映射Java 如何处理结果列表<;T>;同一个'stream()'中'groupingBy'的值?,java,lambda,java-8,java-stream,collectors,Java,Lambda,Java 8,Java Stream,Collectors,简要说明:返回映射map。对于每个K,如何将值List替换为基于List计算的新值(类U),并在同一流()中返回Map 示例:假设我有一个任务,它由一个任务ID和一个作业列表组成: public class Task { int taskId; List<Job> jobList; } 一个任务被划分为多个子任务s,这样每个子任务都可以由单独的“代理”处理: 问题:但是我想返回Map而不是Map;也就是说,我想通过newtask(id,结果列表)将groupingBy的结果列表包
map
。对于每个K
,如何将值List
替换为基于List
计算的新值(类U
),并在同一流()中返回Map
示例:假设我有一个任务
,它由一个任务ID
和一个作业
列表组成:
public class Task { int taskId; List<Job> jobList; }
一个任务
被划分为多个子任务
s,这样每个子任务都可以由单独的“代理”处理:
问题:但是我想返回Map
而不是Map
;也就是说,我想通过newtask(id,结果列表)
将groupingBy
的结果列表
包装成一个新的任务。怎么做?或者是否有没有groupingBy
的替代方案?使用groupingBy
的重载,该重载接受另一个收集器
用于结果:
task.getJobList().stream()
.collect(
groupingBy(
Job::getAgentId,
collectingAndThen(toList(), jobs -> new Task(id, jobs))));
非常好的代码!谢谢你总是这么乐于助人。(只是一点拼写:“job”应该是“jobs”;我无法编辑它,因为只会添加一个字符,stackoverflow对此表示不满。)Louis使用collectingAndThen
的回答完全合理。不过,总的来说,我会避免把“同流合污”的目标看得太远。链式链接很好,但它可以被推得太用力,以至于混淆了正在发生的事情。我们经常看到人们试图将两条河流管道变成“同一条河流”(通过链接终端操作的结果),而简单地承认实际发生的情况会更清楚。目标应该清晰,而不是“最小化分号的数量”
// in class Partition; `Integer` for "agent" id
Map<Integer, Task> partition(Task task) { }
Map<Integer, Task> partition(Task task) {
int id = task.getTaskId();
Map<Integer, List<Job>> agentJobsMap =
task.getJobList().stream()
.collect(groupingBy(Job::getAgentId),
// question here);
}
task.getJobList().stream()
.collect(
groupingBy(
Job::getAgentId,
collectingAndThen(toList(), jobs -> new Task(id, jobs))));