java12 switch,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 films = Arrays.asList(1,2,3);

try (

List 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 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 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 = 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 = Arrays.asList(new Films("G"),new Films("PG"),new Films("PG-13"),new Films("R"),new Films("NC-17") .......);

Map 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和方法引用。更多操作后续完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值