Потоки Java8: фильтрация данных из двух списков командных объектов.Есть ли другой эффективный способ того, что я делаю? - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть два списка, которые содержат WorkflowCommand с и WorkflowInstanceCommand с.

public List<WorkflowCommand> workflowList = new ArrayList<>();
public List<WorkflowInstanceCommand> workflowInstanceList = new ArrayList<>();

public class WorkflowCommand {

  int id;
  String name;
  String author;
  int version;

  @Override
  public String toString() {
    return "WorkflowCommand{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", author='" + author + '\'' +
            ", version=" + version +
            '}';
  }

}



public class WorkflowInstanceCommand {

  long id;
  int workflowId;
  String assignee;
  String step;
  String status;

  @Override
  public String toString() {
    return "WorkflowInstanceCommand{" +
            "id=" + id +
            ", workflowId=" + workflowId +
            ", assignee='" + assignee + '\'' +
            ", step='" + step + '\'' +
            ", status='" + status + '\'' +
            '}';
  }
}

Нужно распечатать результаты выше двух

  1. Найти всерабочие процессы с соответствующими им экземплярами Workflow.

  2. Поиск всех рабочих процессов, имеющих запущенные экземпляры, и количество этих экземпляров Workflow.

Код для первого запроса:

workflowList.forEach(w -> {
    System.out.println("==workflow data=="+w);
    workflowInstanceList.stream()
            .filter(wi -> w.getId() == wi.getWorkflowId())
            .forEach(System.out::println);
});

Код для второго запроса:

workflowList.forEach(w -> {
    List<WorkflowInstanceCommand> instanceCommands = workflowInstanceList.stream()
        .filter(wi -> w.getId() == wi.getWorkflowId())
        .filter(wi -> wi.getStatus().equals("RUNNING"))
        .collect(Collectors.toList());

    System.out.println("==workflow data=="+w+"===size=="+instanceCommands.size());
    instanceCommands.forEach(System.out::println);
});

Есть ли другой эффективный способ сделать это?

1 Ответ

0 голосов
/ 11 октября 2018
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toMap;

Первый запрос:

Map<WorkflowCommand, List<WorkflowInstanceCommand>> instancesByWorkflow =
    workflowInstanceList.stream()
        .collect(groupingBy(WorkflowInstanceCommand::getWorkflowId))
        .entrySet().stream()
        .collect(toMap(e -> workflowList.get(e.getKey()), Map.Entry::getValue));

Второй запрос:

Map<WorkflowCommand, Integer> numberOfRunningInstancesByWorkflow =
    .collect(
        toMap(
            e -> e.getKey(),
            e -> e.getValue().stream().filter(i -> i.getStatus().equals("RUNNING")).count()
        )
    );

, и если вы хотите исключить WorkflowCommand с 0 экземплярами, вы должны добавить эту строку во второй запрос:

.entrySet().stream()
    .filter(e -> e.getValue() != 0)
    .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...