如何在同一个 `stream()` 中处理 `groupingBy` 的结果列表 <T> 值?

How to process the resulting List<T> values of `groupingBy` in the same `stream()`?

简述: collect(groupingBy()) return一张图Map<K, List<T>>。对于每个 K,我如何将值 List<T> 替换为基于 List<T> 计算的新值(class U)和 returnMap<K, U>一样stream()


一个例子:假设我有一个Task,它由一个taskId和一个列表组成共 Job 个:

public class Task { int taskId; List<Job> jobList; }

对于每个 Job,方法 getAgentId 确定能够处理它的 "agent":

// in class Job
int getAgentId() { // return the "agent" who is responsible for @param job }

A Task 被划分为多个子 Task,这样每个子 "agent" 都可以由单独的 "agent" 处理:

// in class Partition; `Integer` for "agent" id
Map<Integer, Task> partition(Task task) { }

我的尝试: 我用了groupingBy

Map<Integer, Task> partition(Task task) {
    int id = task.getTaskId();
    Map<Integer, List<Job>> agentJobsMap = 
        task.getJobList().stream()
                         .collect(groupingBy(Job::getAgentId),
                                  // question here);
}

问题:不过我想returnMap<Integer, Task>而不是Map<Integer, List<Job>>;也就是说,我想将 groupingBy 的结果 List<Job> 包装到 new Task(id, the resulting List<Job>) 的新 Task 中。怎么做?或者有没有 groupingBy 的替代品?

使用接受另一个 CollectorgroupingBy 的重载以用于结果:

task.getJobList().stream()
    .collect(
        groupingBy(
             Job::getAgentId,
             collectingAndThen(toList(), jobs -> new Task(id, jobs))));