使用Java 8在嵌入式对象内部设置值

时间:2019-05-13 03:35:12

标签: java java-8 java-stream

我有segments_idssegment_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中设置MaptaskId对象内map的值。

2 个答案:

答案 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())));