Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理结果列表<;T>;同一个'stream()'中'groupingBy'的值?_Java_Lambda_Java 8_Java Stream_Collectors - Fatal编程技术网

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))));