Перезапись вложенных циклов с использованием Java Stream и Lambda - PullRequest
0 голосов
/ 14 апреля 2020

Как мне переписать вложенное ниже для l oop с условиями, использующими java stream и lambda?

for (String taskInit : initialTaskStatus.keySet()) {
            for (String taskFin : finalTaskStatus.keySet()) {
                if (!(taskInit.equalsIgnoreCase(taskFin)))
                    continue;
                else {
                    if (initialTaskStatus.get(taskInit).equalsIgnoreCase("COMPLETE") ||
                            initialTaskStatus.get(taskInit).equalsIgnoreCase("CANCELLED")) {
                        //Do something (1)

                    } else if (initialTaskStatus.get(taskInit).equalsIgnoreCase("IN_PROGRESS")) {
                        //Do something (2)
                    }
                }

            }
        }

Ответы [ 4 ]

0 голосов
/ 14 апреля 2020

Это то, что я бы сделал:

List<String> status = Arrays.asList("COMPLETE", "CANCELED");
    String IN_PROGRESS = "IN_PROGRESS";

    initialTaskStatus.keySet().forEach(taskInit -> finalTaskStatus.keySet().forEach(taskFin ->{
        if (status.contains(initialTaskStatus.get(taskInit).toUpperCase())) {
            //Do something (1)

        } else if (IN_PROGRESS.equals(initialTaskStatus.get(taskInit).toUpperCase())) {
            //Do something (2)
        }
    }));
0 голосов
/ 14 апреля 2020

Класс задачи не был предоставлен, поэтому для этого примера я предполагаю, что он является строкой. Все, что вам нужно сделать, это собрать все ключи с окончательной карты, которые существуют на исходной карте, если они имеют одинаковый статус. Вы можете собрать в список, а затем работать после.

        Map<String, String> initialTaskStatus = new HashMap<>();

        Map<String, String> finalTaskStatus = new HashMap<>();

        List<String> tasks = initialTaskStatus.keySet().stream()
                .filter(initialTask -> finalTaskStatus.keySet()
                        .stream().anyMatch(finalTask -> finalTask.equalsIgnoreCase(initialTask)))
                .collect(Collectors.toList());

        List<String> completeOrCancelled = tasks.stream()
                .filter(task -> task.equalsIgnoreCase("COMPELTE") || task.equalsIgnoreCase("CANCELLED"))
                .collect(Collectors.toList());

        List<String> inProgress = tasks.stream()
                .filter(task -> task.equalsIgnoreCase("IN_PROGRESS"))
                .collect(Collectors.toList());

        completeOrCancelled.forEach(task -> System.out.println("Complete or cancelled!"));
        inProgress.forEach(task -> System.out.println("In progress!"));
0 голосов
/ 14 апреля 2020

Я думаю, что вложенные циклы forEach здесь могут не понадобиться, поэтому следующий фрагмент, включающий извлеченный метод для обработки состояния, должен выполнить эту работу:

    initialTaskStatus.entrySet().stream()
        .filter(e -> finalTaskStatus.containsKey(e.getKey()))
        .forEach(e -> handleStatus(e.getValue().toUpperCase()));
    ...

    private void handleStatus(String status) {
        if ("COMPLETE".equals(status) || "CANCELLED".equals(status)) {
            //Do something (1)
        } else if ("IN_PROGRESS".equals(status)) {
            //Do something (2)
        }
    }
0 голосов
/ 14 апреля 2020

Надеюсь, это поможет.

   initialTaskStatus.keySet().forEach(taskInit -> {
        finalTaskStatus.keySet().stream().filter(taskInit::equalsIgnoreCase).forEach(taskFin -> {
            if (initialTaskStatus.get(taskInit).equalsIgnoreCase("COMPLETE") ||
                    initialTaskStatus.get(taskInit).equalsIgnoreCase("CANCELLED")) {
                //Do something (1)

            } else if (initialTaskStatus.get(taskInit).equalsIgnoreCase("IN_PROGRESS")) {
                //Do something (2)
            }
        });
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...