6

简而言之: collect(groupingBy())返回一个 mapMap<K, List<T>>。如何用的新值(类)K值,并返回相同的? List<T>UList<T>Map<K, U> stream()


一个例子:假设我有一个Task,它由 ataskId和一个Jobs 列表组成:

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

对于每个Job, 方法getAgentId确定一个能够处理它的“代理”:

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

ATask被划分为多个 sub - Tasks 使得它们中的每一个都可以由一个单独的“代理”处理:

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

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

4

1 回答 1

11

groupingBy使用接受另一个的重载Collector在结果上使用:

task.getJobList().stream()
    .collect(
        groupingBy(
             Job::getAgentId,
             collectingAndThen(toList(), jobs -> new Task(id, jobs))));
于 2016-01-07T06:46:45.730 回答