如何在同一个 `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
的替代品?
使用接受另一个 Collector
的 groupingBy
的重载以用于结果:
task.getJobList().stream()
.collect(
groupingBy(
Job::getAgentId,
collectingAndThen(toList(), jobs -> new Task(id, jobs))));
简述: 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
的替代品?
使用接受另一个 Collector
的 groupingBy
的重载以用于结果:
task.getJobList().stream()
.collect(
groupingBy(
Job::getAgentId,
collectingAndThen(toList(), jobs -> new Task(id, jobs))));