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

在本文中,我们将研究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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openmv串口发送数据_关于arduino和openmv串口通信的问题

#openmv的代码import sensor, image, timeimport jsonfrom pyb import UART# For color tracking to work really well you should ideally be in a very, very,# very, controlled enviroment where the lighting is constant...blue_threshold ( 0, 60, -20, 64, -128, 0)…

【渝粤教育】国家开放大学2018年春季 0175-21T社会调查研究与方法 参考试题

科目编号&#xff1a;0175 座位号 2017-2018学年度第二学期期末考试 社会调查研究与方法 试题 2018年 7 月 一、单选题&#xff08;本大题共10小题&#xff0c;每小题3分&#xff0c;共计30分&#xff09; &#xff08;★请考生务必将答案填入到下面对应序号的答题框中★&…

主流微型计算机,主流微型计算机硬件系统维护

主流微型计算机硬件系统维护通过其芯片技术的革新来缩短存取时间和提高内存访问周期效率的。FP打兰快页模式与EDO打兰占据原PC内存条的大部分市场&#xff0c;但随着电脑进入奔腾时代,SDRAM已作为内存条最新技术要求取代了前两者在新型号电脑上的位置。SDRAM即同步打兰也…

【渝粤教育】国家开放大学2018年春季 0257-22T高级英语听力(1) 参考试题

试卷代码&#xff1a;0257 2017-2018学年度第二学期期末考试 高级英语听力&#xff08;1&#xff09;试题 2018年7月 注 意 事 项 一、将你的准考证号、学生证号、姓名及分校&#xff08;工作站&#xff09;名称填写在答题纸规定栏内。 考试结束后&#xff0c;把试卷和答题纸放…

什么叫POE交换机?POE交换机使用方法介绍?

供电用的交换机&#xff0c;比如安装网络监控时不方便给摄像头拉电线&#xff0c;就可以使用PoE交换机供电&#xff0c;还有弄无线网络时也可以给AP供电&#xff0c;主要方便&#xff0c;关于怎么使用&#xff0c;如果那些需要供电的设备支持PoE直接连接就行了。那么&#xff0…

【渝粤教育】国家开放大学2018年春季 0359-22T会计学原理 参考试题

科目编号&#xff1a;0359 座位号 2017-2018学年第二学期期末考试 基础会计试题 2018 年7月一、单项选择题&#xff1a;请将正确答案填在下面的表格内 &#xff08;每小题2分&#xff0c;共30分&#xff09; 1.企业法定盈余公积金的计算依据是&#xff08; &#xff09;。 A.…

前9个免费的Java进程监视工具以及如何选择一种

这样就可以运行Java代码了。 也许它甚至可以在生产服务器上运行。 在您完成出色工作之后&#xff0c;我们得到了好消息和令人讨厌的消息。 令人讨厌的消息是&#xff0c;现在开始调试。 就是调试和应用程序性能监视。 这意味着您不仅需要查看编写的代码&#xff0c;还可以查看…

redisson的锁的类型_厉害了,中间件Redisson原来这么好用!

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]作者&#xff1a;bravoban原文&#xff1a;http://tech.lede.com/2017/03/08/rd/server/Redisson/针对项目中使用的分布式锁进行简单的示例配置以及源码解析&#xff0c;并列举源码中使用到的一些基础知识点&#xff0c;但…

计算机应用与科学专业简介,计算机应用技术学科专业简介

计算机应用技术学科是计算机科学与技术一级学科所属的二级学科。该学科以计算机基本理论为基础&#xff0c;突出计算机理论和技术的实际应用&#xff0c;是计算机科学服务于国民经济的钥匙与纽带。本学科主要研究对于计算机各种应用具有共性的理论、技术和方法&#xff0c;以及…

【渝粤教育】国家开放大学2018年春季 0554-21T立体构成(一) 参考试题

编号&#xff1a;0554 座位号&#xff1a; 2017&#xff5e;2018学年度第二学期期末考试 平面构成 试题 2018年7月 一、设计题&#xff1a;&#xff08;100分&#xff09; 在25cm25cm的方形内&#xff0c;用“自由分割”的构成方式&#xff0c;设计一张广告招贴图。主题不限&a…

q7goodies事例_Java 8 Friday Goodies:新的新I / O API

q7goodies事例在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 &#xff0c;现在我们觉得是时候开始一个…

网管交换机与非网管交换机的利弊介绍

交换机可以分为网管交换机以及非网管交换机&#xff0c;网管型交换机就字面上的意思&#xff0c;可以网络管理的交换机&#xff0c;而非网管交换机&#xff0c;是相对网管型交换机而言的&#xff0c;非网管交换机又称为傻瓜型交换机&#xff0c;不需要任何设置&#xff0c;插上…

探探自动配对PHP_CentOS7 - 安装Apache HTTP Server和PHP

安装Apache HTTP Server和PHP你可能听说过LAMP的缩写&#xff0c;它代表Linux&#xff0c;Apache&#xff0c;MySQL和PHP。 它指的是用于提供网站和Web应用程序的流行技术配对。 本文教您如何安装Apache HTTP Server(简称Apache)并将其配置为与PHP一起使用以提供动态Web内容.Ap…

网管型交换机比普通交换机有哪些明显优势

现在网络这么普及&#xff0c;对于交换机的需求也就越发的重要了&#xff0c;而市面上交换机的型号这么多&#xff0c;之前我们也分析过按照不同的情况怎么区分交换机&#xff0c;但浏览名称的时候我们也会发现&#xff0c;许多交换机的简介都会写着网管型交换机和非网管型交换…

广西计算机学业水平考试,2017年6月广西信息技术学业水平考试(1)-2017广西信息技术会考真题...

2017年6月广西壮族自治区普通高中学业水平考试信息技术(全卷满分100分&#xff0c;考试时间90分钟)一、单项选择题(本大题共60小题&#xff0c;每小题1分&#xff0c;共60分。温馨提示&#xff1a;请在答题卡上作答&#xff0c;在本试题上作答无效。)1.下列选项中&#xff0c;属…

cryptojs支持rsa加密_新特性解读 | 从 wireshark 看 MySQL 8.0 加密连接

作者&#xff1a;秦福朗爱可生 DBA 团队成员&#xff0c;负责项目日常问题处理及公司平台问题排查。热爱 IT&#xff0c;喜欢在互联网里畅游&#xff0c;擅长摄影、厨艺&#xff0c;不会厨艺的 DBA 不是好司机&#xff0c;didi~本文来源&#xff1a;原创投稿*爱可生开源社区出品…

2021苏州大学计算机考研分数,苏州大学2021考研分数线已公布

基本要求(一)复试分数线1.各基层研究生培养单位根据本单位学科(专业)考生的初试情况和招生计划&#xff0c;自主确定不低于教育部2021年全国硕士研究生招生考试考生进入复试的一区初试成绩基本要求的复试分数线。(1)同一专业学位的全日制与非全日制复试分数线一致。(2)一志愿上…

工业交换机如何预防雷电?

工业交换机需要综合进行防雷防范&#xff0c;因为如果偏重哪一方的防雷只能称为局部防雷&#xff0c;而局部防雷带有“先天不足”问题。所以工业交换机的防雷不能偏重任何一方。那么工业交换机如何防雷呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细了解下吧&#xf…

sap-erp实施心得_实施动态代理-比较

sap-erp实施心得有时需要拦截某些方法调用&#xff0c;以便每次调用被拦截方法时都执行自己的逻辑。 如果您不属于Java EE的CDI领域&#xff0c;并且不想使用诸如Aspectj之类的AOP框架&#xff0c;那么您将有一个简单而有效的替代方法。 从1.5版开始&#xff0c;JDK附带了类ja…

保存点云数据_PCL入门系列三——PCL进行数据读写

本节课我们将了解到以下内容&#xff1a;基本的PCL中的数据类型&#xff1b;使用PCL进行简单编程&#xff1a;写文件与读文件。一、PCL库基本数据类型上一节课&#xff0c;我们使用PCL库在本地写入了一个名为test_pcd.pcd的文件。我们划分一下程序的任务步骤&#xff1a;构造pc…