以下示例是新的Java 12功能“switch expressions” 以及如何将其与Stream 操作和其他一些流操作结合使用,使代码更加简洁。
Switch Expressions
//Switch表达式允许switch语句直接返回值
public String newSwitch(int day) {
return switch (day) {
case 2, 3, 4, 5, 6 -> "weekday";
case 7, 1 -> "weekend";
default -> "invalid";
} + " category";
}
System.out.print(newSwitch(1));//返回“weekend category”
//对比一下旧版本的写法
public String oldSwitch(int day) {
final String attr;
switch (day) {
case 2,3,4,5,6: {
attr = "weekday";
break;
}
case 7, 1: {
attr = "weekend";
break;
}
default: {
attr = "invalid";
}
}
return attr + " category";
}复制代码
Switch Expressions in Stream
Stream::map
public static void main(String... argv) {
List<Object> films = Arrays.asList(1,2,3);
try (
List<String> languages = films.stream()
.map(f -> "the " + switch (f.getLanguageId()) {
case 1 -> "English";
case 2 -> "French";
case 3 -> "German";
default -> "Unknown";
} + " language").collect(toList());
System.out.println(languages);//[the English language,the French language,the German language]
}
//对比一下旧版写法1
List<String> languages = films.stream()
.map(f -> {
final String language;
switch (f.getLanguageId()) {
case 1: {
language = "English";
break;
}
case 2: {
language = "French";
break;
}
case 3: {
language = "German";
break;
}
default: {
language = "Unknown";
}
}
return "the " + language + " language";
}).collect(toList());
//或者这样
List<String> languages = films.stream()
.map(f -> {
switch (f.getLanguageId()) {
case 1: return "the English language";
case 2: return "the French language";
case 3: return "the German language";
default: return "the Unknown language";
}
}).collect(toList());复制代码
Stream::mapToInt
class Films{
private Integer Id;
private String rate;//电影名
public Films(String rate){
this.rate = rate;
}
}复制代码
//进行数据的统计示例
List<Films> films = Arrays.asList(new Films("G"),new Films("PG"),new Films("PG-13"),new Films("R"),new Films("NC-17") .......);
IntSummaryStatistics statistics = films.stream()
.mapToInt(f -> switch (f.getRating().orElse("Unrated")) {
case "G", "PG" -> 0;
case "PG-13" -> 1;
case "R" -> 2;
case "NC-17" -> 5;
case "Unrated" -> 10;
default -> 0;
}).summaryStatistics();
System.out.println(statistics);//IntSummaryStatistics{count=1000, sum=1663, min=0, average=1.663000, max=5}
//对比一下老版的写法, 其实也没多大区别 。。。
IntSummaryStatistics statistics = films.stream()
.mapToInt(f -> {
switch (f.getRating().orElse("Unrated")) {
case "G": case "PG": return 0;
case "PG-13": return 1;
case "R": return 2;
case "NC-17": return 5;
case "Unrated": return 10;
default: return 0;
}
}).summaryStatistics();复制代码
Stream::collect
//分组统计 输出TreeMap
List<Films> films = Arrays.asList(new Films("G"),new Films("PG"),new Films("PG-13"),new Films("R"),new Films("NC-17") .......);
Map<Integer, Long> ageMap = films.stream()
.collect(
groupingBy( f -> switch (f.getRating().orElse("Unrated")) {
case "G", "PG" -> 0;
case "PG-13" -> 13;
case "R" -> 17;
case "NC-17" -> 18;
case "Unrated" -> 21;
default -> 0;
},
TreeMap::new,
Collectors.counting()
)
);
System.out.println(ageMap);//{0=372, 13=223, 17=195, 18=210}复制代码
总结:
switch表达式有时可以替换许多Stream操作类型的lambda和方法引用。更多操作后续完善。
JDK 12 Download: jdk.java.net/12/