雷卷 java,阿里巴巴资深技术专家雷卷:值得开发者关注的 Java 8 后时代的语言特性...
阿里巴巴资深技术专家雷卷:值得开发者关注的 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 后时代的语言特性...相关推荐
- 阿里巴巴资深技术专家雷卷:值得开发者关注的 Java 8 后时代的语言特性
作者 | 阿里巴巴资深技术专家 雷卷,GitHub ID @linux-china 导读:在 Python.JavaScript 等一众编程语言崛起风靡之际,一代霸主 Java 风采虽不及当年,但仍 ...
- 阿里巴巴资深技术专家无相:我们能从 InteliJ IDEA 中学到什么?
本文来源于阿里巴巴资深技术专家无相在内网的分享,阿里巴巴中间件受权发布. 最近因为工作的关系,要将 Eclipse 的插件升级为 IDEA 插件.升级过程中,对 IDEA 插件做了些学习和研究,希望通 ...
- 阿里巴巴资深技术专家崮德:8 个影响我职业生涯的重要技能
我是上个世纪, 1998 年考入浙江大学的,读的是电子工程,但是在大学期间情不自禁爱地上了计算机,当时在学校学的是汇编语言,C 和 C++ ,也钻研过微软的 VC++ .经历过点亮第一个 8051 板 ...
- java转安卓快吗_安卓开发者要从Java转到Kotlin吗?谷歌说后者支持更多
IT之家5月13日消息 在今年谷歌I/O大会上,谷歌宣布下一步最重要的是"Kotlin first".越来越多的安卓开发者也开始从Java转向Kotlin,许多新的Jetpack ...
- java开发的创意_十个值得开发者投入的移动应用创意
在2010中国移动开发者大会"无线互联应用开发者创业孵化"分论坛中,Frost & Sullivan首席顾问王煜全发表主题为<无线互联的布道与孵化>的演讲,他认 ...
- 阿里巴巴P9大佬雷卷与中间件小哥重新定义:高段位程序员的学习之道
每次看到和程序员相关的段子,我都会会心一笑:这是时代的进步啊! 上个世纪,桌面时代 Bacis.6502汇编 一切都是面向对象 Turbo Pascal 信息学奥林匹克竞赛的常用编程语言 那时候能搞编 ...
- 15 年工龄的资深技术专家职场历程自述
来自:阿里巴巴中间件 Photo @ carlheyerdahl 文 | 崮德 春节前的空档,正是静下来,回顾过往.畅想未来的最佳时期. 去年的这个时候,我们分享过一篇<一位 70 后程序员 ...
- 阿里资深技术专家的10年感悟
阿里妹导读:阿里有许多土话,比如"方法总比困难多"."不淘汰自己就会被别人淘汰"."你感觉不舒服的时候,就是成长的时候".每一句都在激励我们 ...
- 阿里资深技术专家何勉详解研发效能提升的关键
云栖君导读:研发效能的提升必须落实为团队需求.协作和工程技术等实践.接下来的几篇文章,我将结合不同BU的案例,介绍研发效能提升的具体实践. 本篇将从团队协作的实践开始,通过可视化端到端的价值流动过程, ...
最新文章
- android 反调试 方案,Android Native反调试—检测TracerPid值
- 多看看把,条件太多了--leetcode 93. 复原 IP 地址
- Python 量化(四)计算股票的移动平均线
- 京东JIMI用户未来意图预测技术揭秘
- SAP Spartacus HTML Tags 实现介绍
- HugeGraphServer 部署安装
- 使用nmap查看web服务支持的http methods
- 网络电视机顶盒测试软件,网络机顶盒最值得安装的软件,可免费收看全网vip独播剧!...
- 解压软件安装包,winrar
- linux如何伪装ip,如何伪装你的IP(二)
- 大白菜超级U盘启动制作工具V2.0(网络增强版)
- 可以下载视频的手机浏览器
- android 乐固渠道打包,安卓腾讯乐固(legutools)多渠道打包(友盟)
- YOLO 模型的评估指标——IOU、Precision、Recall、F1-score、mAP
- cv::imread读不出图片的解决办法
- 9.9实例操作:MVC设计模式应用遇到的问题和解决办法
- 2021年安全员-A证考试报名及安全员-A证最新解析
- 发现的一款很有个性的时钟插件
- win32窗口机制之CreateWindowEX
- 数码相机使用经验技巧