在Java中简化流上的Lambda表达式

dwa*_*er6 2 java lambda java-stream

我正在尝试自学如何在Java中使用lambda表达式而不是常规的外部迭代类型解决方案.我做了一个简短的程序,我使用整数流并为它们分配等级字母.我没有使用典型的"switch"语句,而是使用了这些lambda表达式.有什么办法可以简化吗?似乎有更好的方法来做到这一点.它有效,但看起来并不整洁.

    grades.stream()
          .mapToInt(Integer::intValue)
          .filter(x -> x >= 90)
          .forEach(x -> System.out.println(x + " -> A"));

    grades.stream()
          .mapToInt(Integer::intValue)
          .filter(x -> x >= 80 && x <= 89)
          .forEach(x -> System.out.println(x + " -> B"));

    grades.stream()
          .mapToInt(Integer::intValue)
          .filter(x -> x >= 70 && x <= 79)
          .forEach(x -> System.out.println(x + " -> C"));

    grades.stream()
          .mapToInt(Integer::intValue)
          .filter(x -> x >= 60 && x <= 69)
          .forEach(x -> System.out.println(x + " -> D"));

    grades.stream()
          .mapToInt(Integer::intValue)
          .filter(x -> x >= 50 && x <= 59)
          .forEach(x -> System.out.println(x + " -> F"));
Run Code Online (Sandbox Code Playgroud)

grades 是一个ArrayList.

有什么办法可以将逻辑全部合并到一个流语句中吗?我试过让他们跟随彼此,但不断得到语法错误.我错过了什么?我试着查看IntStream和Stream的文档,但是找不到我想要的东西.

shm*_*sel 5

只需创建一个单独的函数来映射成绩字母并在单个流中调用它:

static char gradeLetter(int grade) {
    if (grade >= 90) return 'A';
    else if (grade >= 80) return 'B';
    else if (grade >= 70) return 'C';
    else if (grade >= 60) return 'D';
    else return 'F';
}

grades.stream()
      .mapToInt(Integer::intValue)
      .filter(x -> x >= 50)
      .forEach(x -> System.out.println(x + " -> " + gradeLetter(x)));
Run Code Online (Sandbox Code Playgroud)

如果您特别想按年级排序结果,可以在流的开头添加排序:

.sorted(Comparator.comparing(x -> gradeLetter(x)))
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言,这比在流中包含逻辑内联要好得多.当序列中有多个简单的步骤时,流是最可读的. (2认同)