报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

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

  • 2019-09-15
  • 本文字数:3328 字

    阅读完需:约 11 分钟

阿里巴巴资深技术专家雷卷:值得开发者关注的 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>>>();  //lambda  BiFunction<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/binconfd
复制代码


实际的使用中还有一些小的限制,如 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=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 = """    <span style="color: green">Hello %s</span>""";    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 环境,有什么用?也就看看而已。不用担心,有人也想到啦。https://github.com/bsideup/jabel 就是这个项目,支持将 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 的调整等,方便后续同学参考一下。

参考

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。


本文转载自公众号阿里巴巴中间件(ID:Aliware_2018)


原文链接


https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&mid=2247487671&idx=4&sn=a6dbad0819b4f4aaab9bb724892175d9&chksm=fdeb22d7ca9cabc1cc93b14c4cbace077cfcfc19f7fedfc2ce0a4ab88052745b8f1b163d5703&scene=27#wechat_redirect


2019-09-15 08:003451

评论

发布
暂无评论
发现更多内容

anyRTC实时音视频-社交娱乐解决方案

anyRTC开发者

ios android 音视频 WebRTC RTC

旷工三天被开除,公司赔偿十万五 | 法庭上的CTO(9)

赵新龙

CTO 法庭上的CTO

生产环境全链路压测建设历程之十 淘宝网2013年的建设过程

数列科技杨德华

在线医疗的发展和优势

anyRTC开发者

android 音视频 WebRTC RTC 医疗方案

盘点2020 | 30岁了,我终于入门编程了

盘点2020

架构之书:雄伟与《Domain Driven Design》

lidaobing

架构 领域驱动设计

架构师训练营 Week8 - 课后作业

极客大学架构师训练营

数据类型第2篇「字典和集合的原理和应用」

清菡软件测试

测试开发

量化交易APP系统软件开发(现成)

系统开发

Canvas入门实战之用javascript面向对象实现一个图形验证码

徐小夕

Java 大前端 canvas

通过Postman和coding.net发布API

太极程序员

Postman API

架构作业--大数据

Nick~毓

期权代持的“坑”里,加拿大人也在 | 法庭上的CTO(11)

赵新龙

CTO 法庭上的CTO

1428万的Adobe采购纠纷 | 法庭上的CTO(10)

赵新龙

CTO 法庭上的CTO

从零开始学习Java8 Stream,看这篇就够了

Silently9527

Java stream java8

甲方日常 68

句子

工作 随笔杂谈 日常

Java并发编程:多线程如何实现阻塞与唤醒

李尚智

Java并发

【小菜学网络】数据链路层概述

fasionchan

网络编程 计算机网络 网络协议 TCP/IP

架构师训练营W09作业

Geek_f06ede

SPI 在 Dubbo中 的应用

vivo互联网技术

Java jdk dubbo spi

探营苏州数字人民币试点

CECBC

数字人民币

JVM从概述到调优图文详解,含思维脑图深度剖析!

Java架构师迁哥

【经验分享】RTC技术系列之音频编解码

Hanson

C语言服务器编程必备常识

MySQL从删库到跑路

c

Spring Boot 集成 Redis

噜噜猫

Spring Boot

硬核编程:30天=一个网站+一份周刊

老魚

程序员 建站 web全栈

DolphinDB与MongoDB在时序数据上的对比测试

DolphinDB

mongodb 分布式系统 时序数据库 DolphinDB 数据库开发

如何快速打造一款钉钉 Go sdk

Ceelog

钉钉 企业微信 Go 语言

SSO的通用标准OpenID Connect

程序那些事

OAuth 2.0 程序那些事 授权框架 安全框架 openid

互联网新规鼓励保险与大数据、区块链等新技术融合!业内呼吁配套产品管理制度尽快出炉

CECBC

互联网金融

第三代人工智能基础设施背后,是一次技术应用的常识普及运动

脑极体

阿里巴巴资深技术专家雷卷:值得开发者关注的 Java 8 后时代的语言特性_编程语言_雷卷_InfoQ精选文章