阿里巴巴资深技术专家雷卷:值得开发者关注的 Java 8 后时代的语言特性

2019 年 9 月 9 日 云栖社区

作者 | 雷卷,阿里巴巴资深技术专家


首先我们必须承认,Java 8 是一个里程碑式的版本,这个相信大多数Java程序员都认同,其中最知名的是 Streams & Lambda ,这让 Functional Programming 成为可能,让 Java 换发新的活力。这也是即便 Oracle 不在支持 Java 8 的更新,各个云厂商还是积极支持,可以让 Java 8 能继续保留非常长的时间。


目前非常多的同学日常开发并没有切换到 Java 8 后续的版本,所以这篇文章,我们打算写一个后 Java 8 时代的特性,主要是偏向于开发的,不涉及 GC , Compiler , Java Module , Platform 等,如果一一解释,估计非常长的文章,当然后续可以写另外文章介绍。下面的这些特性会影响到我们日常的代码编写。


考虑到 Java 13 马上发布,所以版本覆盖从 9 到 13 ,与此同时 Java Release 的方式调整,一些特性是在某一版本引入(preview),后续收到反馈后做了非常多的增强和完善,这里就不一一说明特性是哪个版本的,你可以理解为后Java 8版本后的特性大杂烩。参考资料来源于官方 features 和 pluralsight 上每一个版本的 Java 特性介绍。


var 关键字(局部变量类型推导) Local-Variable Type Inference


Java 支持泛型,但是如果类型非常长,你又不是特别关注,你用 var 关键字就可以啦,可以让你代码非常简洁。Java IDE 都非常好地支持 var,不用担心代码提示等问题。



复制 confd 文件到 bin 目录下,启动 confd



实际的使用中还有一些小的限制,如 null 赋值问题等,但是这些不是什么问题,马上用起来。


ProcessHandle


虽然我们很少在 Java 中调用系统命令,但是偶尔用到也是有的,当然都是ProcessBuilder 。还有一个就是增强的 ProcessHandle ,可以了解其他进程的一些信息,如获取所有进程、某一进程的启动的命令、启动时间等等。



Collection factory methods


创建 ArrayList , HashSet 还是用 new 方法,有点过时啦,直接使用工厂方法就可以啦。



String 类的新 API


这里没法一一列举,说几个重要的 ,了解后就不需要第三方的 StringUtils 啦。repeat, isEmpty, isBlank, strip, lines, indent, transform, trimIndent, formatted 等


HTTP 2支持


当然如果你使用 OkHTTP 3 那就没有问题,如果你不想引入其他开发包,那么 Java 已经支持 HTTP 2 啦,代码基本也差不多,当然同步和异步都支持。



Text Block(JDK 13)


在之前版本,你要有一大段文本,你要对双引号进行转换,转换后非常不适合阅读,如下:



新的方式 text block:



简单多啦,你可以自由写代码,不用担心各种双引号转换的问题,copy分享转换等。稍等,你为何要在 cleanJsonText 前面添加 //language=json ,这个什么鬼?这个是 IntelliJ IDEA 的一个特性,你的 text block 还是有语义的,如是一段HMTL、JSON、SQL 等,添加这个后,马上就代码提示啦。一般人我不告诉他 :)


text block 还有一个小特性就是基本的模板特性支持,你在text block中要引入一些上下文变量,直接 %s ,然后调用 formatted 方法就可以啦。



Switch 提升


Arrow Labels


接入了 "->" switch 箭头,不需要写那么多 break 啦,代码如下:



Switch Expressions


也就是 switch 可以有返回值啦,代码如如下:



关键字 yield 表示 switch 表达式的返回值。


我想马上使用这些特性


你说的这么多,都非常不错,但是我们线上还是 Java 8 环境,有什么用?也就看看而已。不用担心,有人也想到啦。https://github.com/bsideup/jabel 就是这个项目,支持将 JDK 12+ 的各种语法能够透明编译到 Java 8 的 VM 上,也就是你现在用这些语法特性跑在 Java 8 上完全没有问题,所以即便是 Java 8 的环境,没有问题,以上的特性都可以使用。


如何使用?非常简单。


首先下载最新的 JDK,如 JDK 13 ,然后在依赖中添加 jabel-java-plugin



然后调整一下 maven 的 compiler plugin,将 source 设置为你想要的 Java 版本,如 13 , target 和 release 设置为 8 就可以啦。IntelliJ IDEA 会自动识别,也不需要调整。



这样你就可以愉快地使用介绍的特性啦。


总结


如果有一些特性没有整理,而且非常有用的,大家反馈一下,如 API 的调整等,方便后续同学参考一下。


更多精彩


识别二维码测试你的云职业,领取会员大礼包!



如果觉得本文还不错,点击在看一下!
点此进入测试你的云职业并领取会员大礼包
登录查看更多
0

相关内容

Java 是一门编程语言,拥有跨平台、面向对象、泛型编程等特性。
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
【2020新书】C++20 特性 第二版,A Problem-Solution Approach
专知会员服务
58+阅读 · 2020年4月26日
【资源】100+本免费数据科学书
专知会员服务
107+阅读 · 2020年3月17日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
支持多标签页的Windows终端:Fluent 终端
Python程序员
7+阅读 · 2019年4月15日
从webview到flutter:详解iOS中的Web开发
前端之巅
5+阅读 · 2019年3月24日
Python3.8新特性概览
Python程序员
4+阅读 · 2018年12月8日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
快乐的迁移到 Python3
Python程序员
5+阅读 · 2018年3月25日
Neo4j 和图数据库起步
Linux中国
8+阅读 · 2017年12月20日
Arxiv
101+阅读 · 2020年3月4日
Efficiently Embedding Dynamic Knowledge Graphs
Arxiv
14+阅读 · 2019年10月15日
Factor Graph Attention
Arxiv
6+阅读 · 2019年4月11日
Arxiv
30+阅读 · 2019年3月13日
Embedding Logical Queries on Knowledge Graphs
Arxiv
3+阅读 · 2019年2月19日
VIP会员
相关VIP内容
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
【2020新书】C++20 特性 第二版,A Problem-Solution Approach
专知会员服务
58+阅读 · 2020年4月26日
【资源】100+本免费数据科学书
专知会员服务
107+阅读 · 2020年3月17日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
相关资讯
支持多标签页的Windows终端:Fluent 终端
Python程序员
7+阅读 · 2019年4月15日
从webview到flutter:详解iOS中的Web开发
前端之巅
5+阅读 · 2019年3月24日
Python3.8新特性概览
Python程序员
4+阅读 · 2018年12月8日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
快乐的迁移到 Python3
Python程序员
5+阅读 · 2018年3月25日
Neo4j 和图数据库起步
Linux中国
8+阅读 · 2017年12月20日
相关论文
Arxiv
101+阅读 · 2020年3月4日
Efficiently Embedding Dynamic Knowledge Graphs
Arxiv
14+阅读 · 2019年10月15日
Factor Graph Attention
Arxiv
6+阅读 · 2019年4月11日
Arxiv
30+阅读 · 2019年3月13日
Embedding Logical Queries on Knowledge Graphs
Arxiv
3+阅读 · 2019年2月19日
Top
微信扫码咨询专知VIP会员