阿里巴巴资深技术专家雷卷:值得开发者关注的 Java 8 后时代的语言特性
作者 | 阿里巴巴资深技术专家 雷卷,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 后时代的语言特性相关推荐
- 雷卷 java,阿里巴巴资深技术专家雷卷:值得开发者关注的 Java 8 后时代的语言特性...
阿里巴巴资深技术专家雷卷:值得开发者关注的 Java 8 后时代的语言特性 发布时间:2020-07-04 08:25:36 来源:51CTO 阅读:315 作者:阿里系统软件技术 栏目:云计算 作者 ...
- 阿里巴巴P9大佬雷卷与中间件小哥重新定义:高段位程序员的学习之道
每次看到和程序员相关的段子,我都会会心一笑:这是时代的进步啊! 上个世纪,桌面时代 Bacis.6502汇编 一切都是面向对象 Turbo Pascal 信息学奥林匹克竞赛的常用编程语言 那时候能搞编 ...
- 阿里巴巴资深技术专家无相:我们能从 InteliJ IDEA 中学到什么?
本文来源于阿里巴巴资深技术专家无相在内网的分享,阿里巴巴中间件受权发布. 最近因为工作的关系,要将 Eclipse 的插件升级为 IDEA 插件.升级过程中,对 IDEA 插件做了些学习和研究,希望通 ...
- 微软Build 2017第一天:值得开发者关注的热点
2017年5月10日,微软 Build 2017在美国西雅图如期举办.Build大会是微软面向开发者社区举办的重要会议,此次Build大会将于5月12日结束.Build大会近几年连续多次在美国旧金山举 ...
- 阿里巴巴资深技术专家崮德:8 个影响我职业生涯的重要技能
我是上个世纪, 1998 年考入浙江大学的,读的是电子工程,但是在大学期间情不自禁爱地上了计算机,当时在学校学的是汇编语言,C 和 C++ ,也钻研过微软的 VC++ .经历过点亮第一个 8051 板 ...
- 鸿蒙 OS 2.0 来了!值得开发者关注的是什么?
作者 | 马超 责编 | 沭七 出品 | CSDN(ID:CSDNnews) 去年 8 月 9 日的华为开发者大会(HDC 2019)上,华为常务董事.华为消费者业务 CEO 余承东,正式发布了鸿蒙操 ...
- 阿里雷卷:Reactive 基金会的成立将对开发方式带来哪些影响?
作者 | 赵钰莹 近日,Linux 基金会宣布成立 Reactive 基金会.对于 Reactive,各位开发者应该并不陌生,尤其是 Node.js 开发者,但真正了解并意识到这件事情对开发方式带来的 ...
- 阿里资深技术专家何勉详解研发效能提升的关键
云栖君导读:研发效能的提升必须落实为团队需求.协作和工程技术等实践.接下来的几篇文章,我将结合不同BU的案例,介绍研发效能提升的具体实践. 本篇将从团队协作的实践开始,通过可视化端到端的价值流动过程, ...
- 15 年工龄的资深技术专家职场历程自述
来自:阿里巴巴中间件 Photo @ carlheyerdahl 文 | 崮德 春节前的空档,正是静下来,回顾过往.畅想未来的最佳时期. 去年的这个时候,我们分享过一篇<一位 70 后程序员 ...
最新文章
- 解决启动hadoop时datanode无法启动
- jQuery - 获取并设置 CSS 类
- 2018南京网络赛 G. Lpl and Energy-saving Lamps (线段树非递归实现)
- Java中sleep,wait,yield,join的区别
- 面象对象设计6大原则之一:单一职责原则
- 如何实现Punycode中文域名转码
- c 子类对象 访问父类对象受保护成员_面向对象编程(OOP)
- 企业微信添加机器人定时喊吃饭
- Pandas DataFrame 函数应用和映射
- font-family:常用中文字体的英文名称 (宋体 微软雅黑)
- ORCAD学习系列之一 ORCAD元器件库的建立
- 概率论与随机过程难题整理复习
- (杂谈二) 看看别人是怎么写程序的(程序员的自我修养)
- JAVA学习笔记(6)——接口与多态
- 计算机特殊的标点符号教案,三年级下册信息技术《标点符号的输入》教学设计...
- 从NVIDIA官方网站上下载CUDA的方法
- Error 1718. File was rejected by digital signature policy错误,文件的数字签名被你的本地软件策略给拒绝了,来看看解决方法
- arw是什么格式?arw格式用什么软件打开?arw格式怎么转换成jpg
- 【Docker系列】docker manifest
- User agent switcher插件百度云盘不用百度云管家下载大文件