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

标签 java lambda java-8 java-stream collectors

简要说明: collect(groupingBy()) 返回 map Map<K, List<T>> .如何为每个 K 替换 , , 值 List<T>由基于 U 计算的新值(属于 List<T> 类) , 并返回 Map<K, U>相同 stream()


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

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

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

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

A Task被分成多个子- Task这样它们中的每一个都可以由单独的“代理”处理:

// 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通过 new Task(id, the resulting List<Job>) .怎么做?或者有没有没有 groupingBy 的替代品?

最佳答案

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

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

关于java - 如何在同一个 `groupingBy` 中处理 `stream()` 的结果 List<T> 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34648849/

相关文章:

java - 为什么 Oracle 并行流教程使用新的 ArrayList<>(Arrays.asList(arr))?

java - 将字母表添加到 Java 列表

java - Spring Data MongoDB,按长值搜索

java - JFreeCharts TimeSeriesCharts 没有 X 值

linq - linq/lambda 中的多行 foreach 循环

java - 使用 forEach() 时如何调用实例方法

java - 如何在 JTable 中一次只选择一行?

java - 获取 Active Directory 中具有特殊字符的组名称的组属性

java - 无法解析扩展 ArrayAdapter 的类中的方法 super

Python 3 列表排序与决胜局