以下示例是新的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/