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

发布时间:2020-07-04 08:25:36

来源:51CTO

阅读:315

作者:阿里系统软件技术

栏目:云计算

作者 | 阿里巴巴资深技术专家  雷卷,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>> store = new ConcurrentHashMap>>();

Map>> store = new ConcurrentHashMap<>();

Map>> store = new ConcurrentHashMap>>();

//lambda

BiFunction 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 ints = Set.of(1, 2, 3);

List 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 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=json

String cleanJsonText = """

{"id": 1, "nick": "leijuan"}""";

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

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

//language=html

String textBlock = """

Hello %s""";

System.out.println(textBlock.formatted(nick));

Switch 提升

Arrow Labels

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

//legacy

switch (DayOfWeek.FRIDAY) {

case MONDAY: {

System.out.println(1);

break;

}

case WEDNESDAY: {

System.out.println(2);

break;

}

default: {

System.out.println("Unknown");

}

}

//Arrow labels

switch (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 value

int 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。

com.github.bsideup.jabel

jabel-javac-plugin

0.2.0

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

org.apache.maven.plugins

maven-compiler-plugin

3.8.1

13

8

8

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

总结

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

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

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

    作者 | 阿里巴巴资深技术专家  雷卷,GitHub ID @linux-china 导读:在 Python.JavaScript 等一众编程语言崛起风靡之际,一代霸主 Java 风采虽不及当年,但仍 ...

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

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

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

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

  4. java转安卓快吗_安卓开发者要从Java转到Kotlin吗?谷歌说后者支持更多

    IT之家5月13日消息 在今年谷歌I/O大会上,谷歌宣布下一步最重要的是"Kotlin first".越来越多的安卓开发者也开始从Java转向Kotlin,许多新的Jetpack ...

  5. java开发的创意_十个值得开发者投入的移动应用创意

    在2010中国移动开发者大会"无线互联应用开发者创业孵化"分论坛中,Frost & Sullivan首席顾问王煜全发表主题为<无线互联的布道与孵化>的演讲,他认 ...

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

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

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

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

  8. 阿里资深技术专家的10年感悟

    阿里妹导读:阿里有许多土话,比如"方法总比困难多"."不淘汰自己就会被别人淘汰"."你感觉不舒服的时候,就是成长的时候".每一句都在激励我们 ...

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

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

最新文章

  1. android 反调试 方案,Android Native反调试—检测TracerPid值
  2. 多看看把,条件太多了--leetcode 93. 复原 IP 地址
  3. Python 量化(四)计算股票的移动平均线
  4. 京东JIMI用户未来意图预测技术揭秘
  5. SAP Spartacus HTML Tags 实现介绍
  6. HugeGraphServer 部署安装
  7. 使用nmap查看web服务支持的http methods
  8. 网络电视机顶盒测试软件,网络机顶盒最值得安装的软件,可免费收看全网vip独播剧!...
  9. 解压软件安装包,winrar
  10. linux如何伪装ip,如何伪装你的IP(二)
  11. 大白菜超级U盘启动制作工具V2.0(网络增强版)
  12. 可以下载视频的手机浏览器
  13. android 乐固渠道打包,安卓腾讯乐固(legutools)多渠道打包(友盟)
  14. YOLO 模型的评估指标——IOU、Precision、Recall、F1-score、mAP
  15. cv::imread读不出图片的解决办法
  16. 9.9实例操作:MVC设计模式应用遇到的问题和解决办法
  17. 2021年安全员-A证考试报名及安全员-A证最新解析
  18. 发现的一款很有个性的时钟插件
  19. win32窗口机制之CreateWindowEX
  20. 数码相机使用经验技巧

热门文章

  1. Redis设置外网可访问
  2. Django连接mysql数据库浅析
  3. Android ADB Server启动失败
  4. STL中map/vector的删除元素操作
  5. 大一期末计算机应用基础考什么,大学计算机应用基础期末考试题
  6. eclipse让项目连接服务器失败,eclipse怎么链接服务器
  7. matlab面向对象排序,matlab面向对象编程基础
  8. java并发实战看不懂,附带学习经验
  9. python【蓝桥杯vip练习题库】ADV-298 和谐宿舍2(DP)
  10. 【Ubuntu入门到精通系列讲解】Linux 终端命令格式