【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

阿里巴巴资深技术专家雷卷:值得开发者关注的 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:003302

评论

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

图解MySQL中SQL语句的执行过程

程序员小毕

Java MySQL 数据库 sql 程序员

Docker学习路线13:部署容器

小万哥

Java c++ Python Go Docker

Unleashing the Power of WiFi 7: A 320MHz Channel Bandwidth-Double the Width, Double the possibility

wallyslilly

线程池中多余的线程是如何回收的?

java易二三

Java 编程 程序员 面试 计算机

技术分享|GrowingIO分析云对ClickHouse的实践

Geek_2d6073

Java 命令行参数解析方式探索(三):Picocli

冰心的小屋

Java 命令行 console Parameter Picocli

看头部银行保险企业如何释放数智生产力|数智新金融论坛精彩回顾

Kyligence

数智化 Kyligence Copilot

Sanic 是什么:扩展性和性能并存的Web框架

Apifox

Python 程序员 后端 异步编程 sanci

How to choose WIFI7 IPQ9554- WIFI6 IPQ8072? Who has the better performance?

wifi6-yiyi

5G wifi6 6G wiif7

助力企业出海!TDengine Cloud 正式入驻 AWS Marketplace

爱倒腾的程序员

时序数据库

火山引擎DataLeap的Data Catalog系统公有云实践 (下)

字节跳动数据平台

数据库 数据中台 数据治理 数据安全 企业号 7 月 PK 榜

saas平台定义以及优点、特点简单介绍

行云管家

SaaS 平台

用友推出基于 BIP3 的新一代 HOP 产品

用友BIP

医疗

Linux系统PHP性能优化详细教程。

百度搜索:蓝易云

php 云计算 Linux 运维 云服务器

使用Cloud Studio&Flutter完成全平台博客网站的搭建

坚果

flutter Cloud Studio

新功能 – Cloud WAN:托管 WAN 服务

亚马逊云科技 (Amazon Web Services)

Amazon VPC

AIRIOT可视化组态引擎如何应用于物联业务场景中

AIRIOT

Java break语句详解!

java易二三

Java 编程 计算机 break 循环

桂林等级保护测评机构有几家?有哪些?哪里可以查到?

行云管家

等级保护 等保测评 桂林 桂林广西

【腾讯云 Cloud Studio 实战训练营】沉浸式体验编写一个博客系统

全栈若城

项目实战 Cloud Studio

软件测试/测试开发丨Python 内置库 OS 学习笔记分享

测试人

Python 软件测试 测试开发 os内置库

向量数据库这杯“啤酒”与“泡沫”

脑极体

AI 向量数据库

Java零基础适合看的5本书!

java易二三

Java 编程 教学 新手入门

前端服务化和小程序容器技术的应用

没有用户名丶

快速玩转 Llama2!阿里云机器学习 PAI 推出最佳实践(三)——快速部署 WebUI

阿里云大数据AI技术

人工智能

直播平台源码开发提高直播质量的关键:视频编码和解码技术

山东布谷科技

软件开发 直播 视频编解码 源码搭建 直播平台源码

面试还不懂Redis与MySQL数据一致性,看这篇就够了

程序员小毕

Java 数据库 程序员 面试 架构师

Java 后端有哪些不用学的技术?劝退。。。

java易二三

Java 编程 计算机 jsp

MegEngine Python 层模块串讲(中)

MegEngineBot

Python 深度学习 开源

Linux系统MySQL数据库性能优化详细教程。

百度搜索:蓝易云

MySQL 云计算 Linux 运维 云服务器

零代码,使用 Dify 两分钟接入企业微信 AI 机器人

Dify

开源 AI LLMOps

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