值得开发者关注的 Java 8 后时代的语言特性

举报
G-washington 发表于 2019/10/28 21:27:47 2019/10/28
【摘要】 首先我们必须承认,Java 8 是一个里程碑式的版本,这个相信大多数Java程序员都认同,其中最知名的是 Streams & Lambda ,这让 Functional Programming 成为可能,让 Java 换发新的活力。

首先我们必须承认,Java 8 是一个里程碑式的版本,这个相信大多数Java程序员都认同,其中最知名的是 Streams & Lambda ,这让 Functional Programming 成为可能,让 Java 换发新的活力。这也是即便 Oracle 不在支持 Java 8 的更新,各个云厂商还是积极支持,站点为 https://adoptopenjdk.net/ ,可以让 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,不用担心代码提示等问题。
image.png




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


image.png



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



ProcessHandle




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


image.png



Collection factory methods




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


image.png



String 类的新 API




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




HTTP 2支持




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


image.png


Text Block(JDK 13)




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


image.png


新的方式 text block:
image.png



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

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


image.png


Switch 提升




Arrow Labels

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


image.png



Switch Expressions

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



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





我想马上使用这些特性





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

如何使用?非常简单。

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


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

image.png


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



总结




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




参考




Java 9 Features: 
https://openjdk.java.net/projects/jdk9/
Java 10 Features:
https://openjdk.java.net/projects/jdk/10/
Java 11 Features: 
https://openjdk.java.net/projects/jdk/11/
Java 12 Features: 
https://openjdk.java.net/projects/jdk/12/
Java 13 Features: 
https://openjdk.java.net/projects/jdk/13/
Java 14 Features:
 https://openjdk.java.net/projects/jdk/14/

本文作者:


雷卷,阿里巴巴资深技术专家,GitHub ID @linux-china。

本文转载自微信公众号JavaGuide

原文链接:https://mp.weixin.qq.com/s/3mUz9Nr0iz-7LfSsfzVSdw

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。