我有segments_ids
和segment_ids
这样的对象
List<taskDetail> taskDetails
TaskDetail DTO
就像
public class TaskDetail {
private Task task ;
private int taskId;
private int taskDetailId;
private String status;
...
}
所以我必须检查Task DTO
内的所有条目,并获得 public class Task{
private int taskId;
private int totalActive;
.....
}
作为状态的taskDetails
的总数,并在具有匹配{{ 1}}在taskId
内部ACTIVE
中。我可以使用java7做到这一点,但只能使用java8。
我正在使用task's totalActive
并将taskId
存储为密钥
embedded task object
并再次在taskDetails
中设置Map
中taskId
对象内map的值。
答案 0 :(得分:1)
首先,我们流式传输任务详细信息列表,仅过滤“活动”列表。然后,按taskId
分组以创建taskId到该taskId的TaskDetails
列表的映射。对于给定的taskId(这是列表的长度),这还将为我们提供TaskDetails
的数量。
然后,我们遍历它并通过推断totalActive
作为列表的长度来更新TaskDetails的Task totalActive
。
(假设您有一个二传手)
Map<Integer, List<TaskDetail>> taskIdToTaskDetailsList = taskDetails.stream()
.filter(taskDetail -> taskDetail.getStatus().equals("ACTIVE"))
.collect(Collectors.groupingBy(TaskDetail::getTaskId));
taskIdToTaskDetailsList.values()
.forEach(listOfTaskDetails -> listOfTaskDetails
.forEach(taskDetail -> taskDetail.getTask()
.setTotalActive(listOfTaskDetails.size())));
注意:为使此正常工作,taskId
中的TaskDetail
必须与taskId
字段的task
相匹配。>
答案 1 :(得分:0)
尽管我建议不要将变异和流一起练习,但是可以使用counting
(或reduce
)并通过过滤器将列表更新为: / p>
Map<Integer, Integer> myTaskMap = taskDetails.stream()
.filter(taskEdt -> taskEdt.getStatus().equals("ACTIVE"))
.collect(Collectors.groupingBy(taskEdt -> taskEdt.getTask().getTaskId(),
Collectors.reducing(0, e -> 1, Integer::sum)));
taskDetails.stream()
.filter(taskEdt -> myTaskMap.containsKey(taskEdt.getTask().getTaskId()))
.forEach(taskEdt -> taskEdt.getTask().setTotalActive(
myTaskMap.get(taskEdt.getTask().getTaskId())));