阿里巴巴资深技术专家雷卷:值得开发者关注的 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 环境,有什么用?也就看看而已。不用担心,有人也想到啦。 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 的调整等,方便后续同学参考一下。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWS 专家教你使用 Spring Boot 和 DJL ,轻松搭建企业级机器学习微服务!

作者 | Qing Lan&#xff0c;Mikhail Shapirov责编 | Carol封图 | CSDN 下载自视觉中国出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;许多AWS云服务的用户&#xff0c;无论是初创企业还是大公司&#xff0c;都在逐步将机器学习 (ML) 和深度学习 (DL) 任务…

【从入门到放弃-ZooKeeper】ZooKeeper入门

前言 ZooKeeper是一个分布式服务协调框架&#xff0c;可以用来维护分布式配置信息、服务注册中心、实现分布式锁等。在Hbase、Hadoop、kafka等项目中都有广泛的应用。随着分布式、微服务的普及&#xff0c;ZooKeeper已经成为我们日常开发工作中无法绕过的一环&#xff0c;本文…

ln: failed to create symbolic link ‘/usr/bin/mysql’: File exists

问题描述&#xff1a; ln -s /usr/local/mysql/bin/mysql /usr/bin 在centos7进行软链接设置的时候&#xff0c;出现了这么问题&#xff1a;问题就是说这个文件已存在&#xff0c; 解决方法&#xff1a;覆盖之前的 ln -sf /usr/local/mysql/bin/mysql /usr/bin

读透《阿里巴巴数据中台实践》,其到底有什么高明之处?

最近阿里巴巴分享了《阿里巴巴数据中台实践》这个PPT&#xff08;自行搜索原始文章&#xff09;&#xff0c;对于数据中台的始作俑者&#xff0c;还是要怀着巨大的敬意去学习的&#xff0c;因此仔细的研读了&#xff0c;希望能发现一些不一样的东西。 读这些专业的PPT&#xf…

如果你也想做实时数仓…

数据仓库也是公司数据发展到一定规模后必然会提供的一种基础服务&#xff0c;数据仓库的建设也是“数据智能”中必不可少的一环。本文将从数据仓库的简介、经历了怎样的发展、如何建设、架构演变、应用案例以及实时数仓与离线数仓的对比六个方面全面分享关于数仓的详细内容。 …

华为云战略投入政企市场,发布华为云Stack

2020年5月15日&#xff0c;华为云发布政企战略&#xff0c;并宣布华为云Stack系列新品正式上市。华为云Stack是位于政企客户本地数据中心的云基础设施&#xff0c;能为政企客户提供在云上和本地部署体验一致的云服务。随着政企智能升级进入深水区&#xff0c;华为云将战略投入政…

Mysql 启动报错解析:Starting MySQL.. ERROR! The server quit without updating PID file (/usr/local/mysql/dat

现象&#xff1a; rootcentos74 ~]# service mysqld start Starting MySQL.. ERROR! The server quit without updating PID file (/usr/local/mysql/data/mysqld.pid).解决方案&#xff1a; 可能已经存在 mysqld 进程. [rootcentos74 ~]# ps -ef | grep mysqld [rootcentos7…

如何在 Apache Flink 中使用 Python API?

本文根据 Apache Flink 系列直播课程整理而成&#xff0c;由 Apache Flink PMC&#xff0c;阿里巴巴高级技术专家 孙金城 分享。重点为大家介绍 Flink Python API 的现状及未来规划&#xff0c;主要内容包括&#xff1a;Apache Flink Python API 的前世今生和未来发展&#xff…

阿里云HBase Ganos全新升级,推空间、时空、遥感一体化基础云服务

1、HBase Ganos是什么 Ganos是阿里云时空PaaS服务的自研核心引擎。Ganos已作为云数据库时空引擎与数据库平台融合&#xff0c;建立了以自研云原生数据库POALRDB为基础&#xff0c;联合NoSQL大数据平台&#xff08;Ali-HBASE和X-Pack Spark&#xff09;的完整时空地理信息云化管…

看完这篇操作系统,和面试官扯皮就没问题了!

作者 | Cxuan责编 | Carol来源 | 程序员 cxuan封图 | CSDN 付费下载于视觉中国1、解释一下什么是操作系统操作系统是运行在计算机上最重要的一种软件&#xff0c;它管理计算机的资源和进程以及所有的硬件和软件。它为计算机硬件和软件提供了一种中间层。通常情况下&#xff0c;…

Linux centos7 安装 MySQL5.7.x

文章目录一、下载安装2. wget 下载方式3. 安装4. 初始化数据库二、修改密码2.1. 修改密码2.2. 修改密码2.3. 允许远程访问2.4. 关闭防火墙2.4. 建立mysql软连接一、下载安装 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.html#downloads 下载地址&#xff…

顺序结构,选择结构,反编译

顺序结构 Java基本结构就是顺序结构&#xff0c;除非特别指明&#xff0c;否则就按照顺序一句一句的执行顺序结构是最简单的算法结构任何一个算法都离不开的一种基本算法结构 package com.boss.struct;public class ShunXuDemo {public static void main(String[] args) {Sys…

助力共享经济,芝麻信用背后的技术

近期&#xff0c;CCTV9播放了自制的系列纪录片《大数据时代》&#xff0c;该片是国内首部大数据产业题材纪录片&#xff0c;节目细致而生动地讲述了大数据技术在政府治理、民生服务、数据安全、工业转型、未来生活等方面给我们带来的改变和影响。在第四集中&#xff0c;讲述了芝…

bash: jps: command not found

Centos7 默认安装了openJDK&#xff0c;jps命令不能使用&#xff0c;如果jdk是重新安装指定的版本&#xff0c;默认不需要重新安装jps服务[rootmaven-test ~]# jps bash: jps: command not found... 解决办法[rootmaven-test ~]# yum install -y java-1.8.0-openjdk-devel 再次…

你的项目是否真的需要 DevOps?

DevOps即服务&#xff08;DevOps-as-a-Service&#xff09;是一种新兴的开发理念。DevOps作为一种方法&#xff0c;将传统的团队协作转移到开发和运维团队中&#xff0c;通过使用可堆叠的虚拟扩展工具实现自动化。作者 | raghuraji300译者 | Arvin&#xff0c;责编 | 屠敏头图 …

与你同行,才能无障碍

先给大家分享一个笔者的真实故事。前阵子她被诊断得了急性结膜炎&#xff0c;医生切切叮嘱 72 小时里多闭目养神不能目视任何自光源体&#xff0c;“尤其是电脑和手机&#xff01;”医生特地关照了一句。 她好不容易挪回家&#xff0c;想起一整天未能进食&#xff0c;作为淘宝…

循环结构, while, do……while

循环结构 while循环do……while循环for 循环在Java5引入一种主要用于数组增强型for循环 while循环 while是最基本的循环&#xff0c;结构为&#xff1a; while(布尔表达式){//循环内容 }只要布尔表达式为true&#xff0c;就会一直循环下去我们大多数情况会有循环停下来&…

震惊!阿里的程序员竟被一个简单的 SQL 查询难住了!

作者 | 唐磊责编 | Carol来源 | 程序猿石头封图 | CSDN 付费下载于视觉中国最近工作上遇到一个”神奇”的问题&#xff0c;或许对大家有帮助&#xff0c;因此形成本文。问题大概是&#xff0c;我有两个表 TableA&#xff0c;TableB&#xff0c;其中 TableA 表大概百万行级别(存…

ETL异构数据源Datax_datax-web安装部署_10

文章目录1. 解压2. 一键安装3. 修改执行器py地址4. 一键启动5. 查看启动日志6. 访问地址登录7. 操作记录1. 解压 tar -zxvf datax-web-2.1.2.tar.gz2. 一键安装 # 执行一键安装脚本,系统中需要有mysql环境,会自动执行sql文件初始化bin/install.sh cd datax-web-2.1.2/ bin/in…

3D 真的很难吗,瞧瞧支付宝怎么做?

阿里妹导读&#xff1a;图像作为人类感知世界的视觉基础&#xff0c;是我们在这个信息化时代获取信息、表达信息及传递信息的重要手段&#xff0c;而生成图像最高效准确的方式就是由计算机生成、显示、绘制&#xff0c;这些技术又统称计算机图形技术。计算机图形技术已经是许多…