在本文中,我们将研究Java 12的新功能“ Switch Expressions”,以及如何与Java 12结合使用。
Stream::map操作和其他一些Stream操作。 了解如何使用流和开关表达式使代码更好。

切换表达式

Java 12附带了对“开关表达式”的“预览”支持。 Switch Expression允许switch语句直接返回值,如下所示:

 public String newSwitch( int day) { return switch (day) { case 2 , 3 , 4 , 5 , 6 -> "weekday" ; case 7 , 1 -> "weekend" ; default -> "invalid" ; } + " category" ;  } 

1调用此方法将返回“周末类别”。

这很棒,并使我们的代码更短,更简洁。 我们不必费心去掉顾虑,块,易变的临时变量或遗漏的情况/默认情况,这可能是良好的开关的情况。 只要看一下对应的旧开关示例,您就会明白我的意思:

 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 Expression在Java 12下工作,我们必须通过
编译和运行应用程序时,都将“--enable-preview”作为命令行参数。 事实证明,这有些棘手,但希望它会随着新IDE版本的发布和/或(如果Java将此功能作为完全受支持的功能)合并而变得更加容易。 IntelliJ用户需要使用版本2019.1或更高版本。

在Stream :: map中切换表达式

开关表达式在Stream::map运算符中非常易于使用,尤其是与旧的开关语法相比时。 在以下示例中,我使用了Speedment Stream ORM和Sakila示例数据库 。 Sakila数据库包含有关电影,演员等的全部信息。

这是使用map()结合Switch Expression将电影语言ID( short )解码为完整语言名称( String )的流:

 public static void main(String... argv) { try (Speedment app = new SakilaApplicationBuilder() .withPassword( "enter-your-db-password-here" ) .build()) { FilmManager films = app.getOrThrow(FilmManager. class ); 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); }  } 

这将在数​​据库中创建所有1000部电影的流,然后将每部电影映射到相应的语言名称,并将所有这些名称收集到一个列表中。 运行此示例将产生以下输出(为简洁起见,以下简称):

[英语,英语,…]

如果我们将使用旧的switch语法,则将获得如下所示的内容:

 ... 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中切换表达式

在此示例中,我们将基于电影的评分来计算有关分配分数的摘要统计信息。 根据我们自己的发明规模,限制越严格,得分越高:

 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中切换表达式

最后一个示例显示了在收集器分组中使用switch表达式的情况。 在这种情况下,我们要计算某个最低年龄的人可以看多少部电影。 在这里,我们使用年龄最小的地图作为键,将已计数的电影作为值。

 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 } 

通过提供(可选) groupingBy地图供应商TreeMap::new ,我们可以按年龄顺序排列年龄。 为什么从13岁起就可以看到PG-13,而从17岁起就不能看到NC-17,而是从18岁起就看不到NC-17,但这不在本文的讨论范围之内。

摘要

我期待将Switch Expressions功能正式纳入Java。 开关表达式有时可以替换许多流操作类型的lambda和方法引用。

翻译自: https://www.javacodegeeks.com/2019/03/java-12-mapping-with-switch-expressions.html

Java 12:使用开关表达式进行映射相关推荐

  1. Java 12:开关表达式

    在Java 12中,对switch语句进行了增强,以便可以将其用作表达式. 现在也可以在一种情况下打开多个常量,从而使代码更简洁易读. 这些增强是预览语言功能 ,这意味着必须使用--enable-pr ...

  2. java使用:: 表达式_Java 12:开关表达式

    java使用:: 表达式 在Java 12中,对switch语句进行了增强,以便可以将其用作表达式. 现在也可以在一种情况下打开多个常量,从而使代码更简洁易读. 这些增强功能是一种预览语言功能 ,这意 ...

  3. jdk switch 枚举_JDK 12开关表达式遇到意外的枚举值

    jdk switch 枚举 正如我在" 玩JDK 12的Switch表达式 "一文中所写的那样, JDK 12 Early Access Build使JEP 325 [" ...

  4. JDK 12开关表达式遇到意外的枚举值

    正如我在" 玩JDK 12的Switch表达式 "一文中所写的那样, JDK 12 Early Access Build使JEP 325的实现(" Switch Expr ...

  5. java switch 表达式_尝鲜Java 12新特性:switch表达式

    Java 12将在两个月后(2019/3/19)发布,现已进入RDP1阶段,确定加入8个JEP.其中对Java语法的改进是JEP 325: switch表达式.于是我迫不及待,提前感受一下更先进的语言 ...

  6. Java 12 switch表达式新特性(->,yield)

    switch表达式 使用switch时,如果遗漏了break,就会造成严重的逻辑错误,而且不易在源代码中发现错误.从Java 12开始,switch语句升级为更简洁的表达式语法,使用类似模式匹配(Pa ...

  7. eclipse做java_在Eclipse中使用Java 12

    eclipse做java 1.安装JDK 12 链接: https : //www.oracle.com/technetwork/java/javase/downloads/jdk12-downloa ...

  8. 网页益智游戏怎么制作_休息一下,或者:如何使用Java 12制作出色的益智游戏...

    网页益智游戏怎么制作 Java 12以实验形式提供了switch表达式以及switch和break语句的新形式. 对于可能很少用到的构造,有大量的新语法和语义-当然,对于那些困惑者和认证考试问题的作者 ...

  9. jdk12 switch_玩JDK 12的Switch表达式

    jdk12 switch 在博客文章"操作中的JDK语言功能预览:切换表达式 "中,我讨论了JEP 325 ["切换表达式( 预览 )")如何作为指定的&quo ...

最新文章

  1. three.js 贴图只显示颜色_C4D作品“花里胡哨”?我怀疑你贴图方式有问题……
  2. Servlet的初始化参数
  3. centos 忘记 root 密码
  4. 计算机应用基础在线测试01,计算机应用基础在线测试(全部正确).pdf
  5. Intel硬件加速 VS CUDA完胜 视频转码感受
  6. 每日一题(49)—— 有符号数与无符号数
  7. mac java 读取到服务器上的文件夹_如何在Mac和Win之间高效共享文件?mac和win文件高效共享教程
  8. Java基础学习总结(74)——Java常见笔试题及答案汇总
  9. 【Python】python学习笔记day1
  10. c/c++面试题(1)
  11. 合并模块和安装文件的区别
  12. cookie and session
  13. Unity 中文不显示问题
  14. 编译一个.cpp文件的过程
  15. 缓存 redis 缓存失效 分布式锁 Redisson SpringCache
  16. 将本地视频上传到云端_如何将本地文件上传到新浪云服务器应用
  17. 网友鸿蒙谷歌的Android,华为鸿蒙OS已经确认更名?新名字更加令人惊艳!网友:过目难忘...
  18. 【考研英语】作文只是背模板?正确复习姿势了解下
  19. 清微智能CTO欧阳鹏:架构创新是通往高性能计算芯片必由之路|量子位·视点分享回顾...
  20. java 利用openOffice实现word ppt 等资源转化为pdf文件

热门文章

  1. 洛谷-P1903 数颜色 分块 bitset
  2. Java的GC机制及算法
  3. java之String
  4. (十三)RabbitMQ使用详解
  5. (八)Spring与MyBatis整合
  6. 《金色梦乡》金句摘抄(一)
  7. 循环录(输)入 java 课的学生成绩(5个学生),统计分数大于等于 80 分的学生
  8. 银行营业网点管理系统——implt包(CityAreaDaoImpl )
  9. 玩物得志Java笔试题_代码规范利器-CheckStyle
  10. 什么叫做在oracle目录下,ORACLE directory 目录