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

导读:在 Python、JavaScript 等一众编程语言崛起风靡之际,一代霸主 Java 风采虽不及当年,但仍横扫了各大编程语言排行榜,依旧是各大企业级应用开发语言中的 NO.1。从 Java 8 之后,Java 引入了很多有用的新语言特性,以及新工具和性能改善。但是仍有非常多的同学在日常开发中没有切换到 Java 8 的后续版本。本篇文章将侧重开发方向,为大家介绍后 Java 8 时代的特性。

首先我们必须承认,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,不用担心代码提示等问题。

Map<String, List<Map<String,Object>>>  store = new ConcurrentHashMap<String, List<Map<String,Object>>>();Map<String, List<Map<String,Object>>>  store = new ConcurrentHashMap<>();Map<String, List<Map<String,Object>>>  store = new ConcurrentHashMap<String, List<Map<String,Object>>>();//lambdaBiFunction<String, String, String> function1 = (var s1, var s2) -> s1   s2;System.out.println(function1.apply(text1, text2));

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

sudo cp bin/confd /usr/local/bin
confd

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

ProcessHandle

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

ProcessHandle ph =  ProcessHandle.of(89810).get();
System.out.println(ph.info());

Collection factory methods

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

Set<Integer> ints = Set.of(1, 2, 3);
List<String> strings = List.of("first", "second");

String 类的新 API

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

HTTP 2 支持

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

HttpClient client = HttpClient.newHttpClient();HttpRequest req =HttpRequest.newBuilder(URI.create("https://httpbin.org/ip")).header("User-Agent", "Java").GET().build();HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandlers.ofString());System.out.println(resp.body());

Text Block(JDK 13)

在之前版本,你要有一大段文本,你要对双引号进行转换,转换后非常不适合阅读,如下:
String jsonText = "{"id": 1, "nick": "leijuan"}";

新的方式 text block:

//language=jsonString cleanJsonText = """{"id": 1, "nick": "leijuan"}""";

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

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

//language=htmlString textBlock = """<span style="color: green">Hello %s</span>""";System.out.println(textBlock.formatted(nick));

Switch 提升

Arrow Labels

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

//legacyswitch (DayOfWeek.FRIDAY) {case MONDAY: {System.out.println(1);break;}case WEDNESDAY: {System.out.println(2);break;}default: {System.out.println("Unknown");}}//Arrow labelsswitch (DayOfWeek.FRIDAY) {case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);case TUESDAY -> System.out.println(7);case THURSDAY, SATURDAY -> System.out.println(8);case WEDNESDAY -> System.out.println(9);}

Switch Expressions

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

//Yielding a valueint i2 = switch (DayOfWeek.FRIDAY) {case MONDAY, FRIDAY, SUNDAY -> 6;case TUESDAY -> 7;case THURSDAY, SATURDAY -> 8;case WEDNESDAY -> 9;default -> {yield 10;}};

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

我想马上使用这些特性

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

如何使用?非常简单。

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

<dependency><groupId>com.github.bsideup.jabel</groupId><artifactId>jabel-javac-plugin</artifactId><version>0.2.0</version></dependency>

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

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>13</source><target>8</target><release>8</release></configuration>
</plugin>

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

总结

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

扫描下方二维码添加小助手,与 8000 位云原生爱好者讨论技术趋势,实战进阶!

进群暗号:公司-岗位-城市

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

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

    阿里巴巴资深技术专家雷卷:值得开发者关注的 Java 8 后时代的语言特性 发布时间:2020-07-04 08:25:36 来源:51CTO 阅读:315 作者:阿里系统软件技术 栏目:云计算 作者 ...

  2. 阿里巴巴P9大佬雷卷与中间件小哥重新定义:高段位程序员的学习之道

    每次看到和程序员相关的段子,我都会会心一笑:这是时代的进步啊! 上个世纪,桌面时代 Bacis.6502汇编 一切都是面向对象 Turbo Pascal 信息学奥林匹克竞赛的常用编程语言 那时候能搞编 ...

  3. 阿里巴巴资深技术专家无相:我们能从 InteliJ IDEA 中学到什么?

    本文来源于阿里巴巴资深技术专家无相在内网的分享,阿里巴巴中间件受权发布. 最近因为工作的关系,要将 Eclipse 的插件升级为 IDEA 插件.升级过程中,对 IDEA 插件做了些学习和研究,希望通 ...

  4. 微软Build 2017第一天:值得开发者关注的热点

    2017年5月10日,微软 Build 2017在美国西雅图如期举办.Build大会是微软面向开发者社区举办的重要会议,此次Build大会将于5月12日结束.Build大会近几年连续多次在美国旧金山举 ...

  5. 阿里巴巴资深技术专家崮德:8 个影响我职业生涯的重要技能

    我是上个世纪, 1998 年考入浙江大学的,读的是电子工程,但是在大学期间情不自禁爱地上了计算机,当时在学校学的是汇编语言,C 和 C++ ,也钻研过微软的 VC++ .经历过点亮第一个 8051 板 ...

  6. 鸿蒙 OS 2.0 来了!值得开发者关注的是什么?

    作者 | 马超 责编 | 沭七 出品 | CSDN(ID:CSDNnews) 去年 8 月 9 日的华为开发者大会(HDC 2019)上,华为常务董事.华为消费者业务 CEO 余承东,正式发布了鸿蒙操 ...

  7. 阿里雷卷:Reactive 基金会的成立将对开发方式带来哪些影响?

    作者 | 赵钰莹 近日,Linux 基金会宣布成立 Reactive 基金会.对于 Reactive,各位开发者应该并不陌生,尤其是 Node.js 开发者,但真正了解并意识到这件事情对开发方式带来的 ...

  8. 阿里资深技术专家何勉详解研发效能提升的关键

    云栖君导读:研发效能的提升必须落实为团队需求.协作和工程技术等实践.接下来的几篇文章,我将结合不同BU的案例,介绍研发效能提升的具体实践. 本篇将从团队协作的实践开始,通过可视化端到端的价值流动过程, ...

  9. 15 年工龄的资深技术专家职场历程自述

    来自:阿里巴巴中间件 Photo @ carlheyerdahl 文  |  崮德 春节前的空档,正是静下来,回顾过往.畅想未来的最佳时期. 去年的这个时候,我们分享过一篇<一位 70 后程序员 ...

最新文章

  1. 解决启动hadoop时datanode无法启动
  2. jQuery - 获取并设置 CSS 类
  3. 2018南京网络赛 G. Lpl and Energy-saving Lamps (线段树非递归实现)
  4. Java中sleep,wait,yield,join的区别
  5. 面象对象设计6大原则之一:单一职责原则
  6. 如何实现Punycode中文域名转码
  7. c 子类对象 访问父类对象受保护成员_面向对象编程(OOP)
  8. 企业微信添加机器人定时喊吃饭
  9. Pandas DataFrame 函数应用和映射
  10. font-family:常用中文字体的英文名称 (宋体 微软雅黑)
  11. ORCAD学习系列之一 ORCAD元器件库的建立
  12. 概率论与随机过程难题整理复习
  13. (杂谈二) 看看别人是怎么写程序的(程序员的自我修养)
  14. JAVA学习笔记(6)——接口与多态
  15. 计算机特殊的标点符号教案,三年级下册信息技术《标点符号的输入》教学设计...
  16. 从NVIDIA官方网站上下载CUDA的方法
  17. Error 1718. File was rejected by digital signature policy错误,文件的数字签名被你的本地软件策略给拒绝了,来看看解决方法
  18. arw是什么格式?arw格式用什么软件打开?arw格式怎么转换成jpg
  19. 【Docker系列】docker manifest
  20. User agent switcher插件百度云盘不用百度云管家下载大文件

热门文章

  1. 【PHP】关于IPv4、IPv6 的操作函数
  2. 12、INNER JOIN:内连接
  3. 145. 超市【小根堆 贪心】
  4. 【PAT乙级】1043 输出PATest (20 分)
  5. 5.1.1 IO设备的概念与分类
  6. RabbitMQ的Work模式
  7. python 创建netcdf_python读取与处理netcdf数据方式
  8. pythontkinter在一块区域中绘图_用Python中的tkinter模块作图(续)
  9. 最简单java设计模式:抽象工厂模式
  10. 并发基础篇(四): java中线程的状态深入浅出