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的文档,但是找不到我想要的东西.
只需创建一个单独的函数来映射成绩字母并在单个流中调用它:
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)
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |