【问题标题】:Rewriting nested for loops using Java Stream and Lambda [duplicate]使用 Java Stream 和 Lambda 重写嵌套的 for 循环 [重复]
【发布时间】:2020-04-14 12:35:55
【问题描述】:

如何使用 java 流和 lambda 重写下面的嵌套 for 循环?

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)
                    }
                }

            }
        }

【问题讨论】:

  • 为什么必须用流重写?
  • 除了主要问题:为什么 if (!condition){ continue; }else{ someJob(); } 而不是 if(condition){ someJob(); } 在你的情况下相当于 if(condition){ someJob(); }else{ continue; } 因为除了 if 内部循环之外没有其他代码?

标签: java java-8 java-stream


【解决方案1】:

我认为这里可能不需要嵌套的 forEach 循环,所以下面的 sn-p 包括一个提取的处理状态的方法应该可以完成这项工作:

    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)
        }
    }

【讨论】:

    【解决方案2】:

    希望这会有所帮助。

       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)
                }
            });
        });
    

    【讨论】:

      【解决方案3】:

      没有提供任务类,所以对于这个例子,我假设它是一个字符串。您所要做的就是从最终映射中收集存在于初始映射中的所有键(如果它们具有相同的状态)。你可以收集到一个List,然后再操作。

              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!"));
      

      【讨论】:

        【解决方案4】:

        这是我会做的事情:

        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)
                }
            }));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-30
          • 2018-09-17
          • 1970-01-01
          • 2020-08-09
          • 1970-01-01
          • 1970-01-01
          • 2022-01-19
          相关资源
          最近更新 更多