Java12 switch 表达式

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


转载于:https://juejin.im/post/5cf5eb9bf265da1baa1e6062

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值