установить значение внутри встроенного объекта с помощью Java 8 - PullRequest
0 голосов
/ 13 мая 2019

У меня есть объект как 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 и получить общее количество подсчетов против taskId, которые ACTIVE как статус и установлены внутри task's totalActive объекта, имеющего соответствие taskId внутри embedded task object внутри taskDetails Я могу сделать это с помощью java7, но застрял в использовании java8.

Я использую Map и храню taskId в качестве ключа

  Map<Integer,Integer> myTaskMap = new HashMap<Integer,Integer>();
  taskDetails.forEach(taskEdt->{
                int count =myTaskMap.get(taskEdt.getTask().getTaskId());
                if(taskEdt.getStatus() == Status.ACTIVE) {
                coun>0? myTaskMap.put(taskEdt.getTask().getTaskId(), count+1);:myTaskMap.put(taskEdt.getTask().getTaskId(), 1)
                }
            });


taskDetails.forEach(taskEdt->{
                if(null !=myTaskMap.get(taskEdt.getTask().getTaskId())) {
                    taskEdt.getTask().setTotalActive(myTaskMap.get(taskEdt.getTask().geTaskId()));
                }
            });

и снова в ForEach значение установки с карты внутри Task;s totalActive объект внутри taskDetails.

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Во-первых, мы транслируем список деталей задачи, фильтруя только АКТИВНЫЕ.Затем сгруппируйте по taskId, чтобы создать сопоставление taskId со списком TaskDetails для этого taskId.Это также даст нам номер TaskDetails для заданного идентификатора задачи (который является длиной списка).

Затем мы запускаем его и обновляем задачу TaskDetails totalActive, выводя 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поле.

0 голосов
/ 13 мая 2019

Хотя мутация вместе с потоками - это то, что я бы предложил не практиковать, а способ сделать то, что вы намеревались, возможно, используя counting (или reduce) и далее с фильтром, обновляющим список как:

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())));
...