阿里巴巴资深技术专家雷卷:值得开发者关注的 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>>>();
  //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/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=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 环境,有什么用?也就看看而已。不用担心,有人也想到啦。?这个项目,支持将 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 位云原生爱好者讨论技术趋势,实战进阶!
进群暗号:公司-岗位-城市

原文地址:https://blog.51cto.com/13778063/2437226

时间: 2024-10-13 18:31:11

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

阿里8年资深技术专家谈企业级互联网架构的演进之路

沈询,阿里巴巴中间件&稳定性平台资深技术专家,在淘宝工作八年间,主要负责的产品有淘宝分布式数据库(TDDL/DRDS).分布式消息系统(Notify/ONS)等,故对整个分布式的互联网架构比较了解.本文分享围绕阿里技术架构演进及过程中遇到的问题与企业级信息系统架构的演进展开. 阿里技术架构演进及过程中遇到的问题 2003 年,淘宝最初的架构建设是采用 PHP,实践发现系统抗压能力相对薄弱.因为淘宝是一个企业级系统,所以选择了当时非常重要的企业级技术 JavaBean.之后把整个 Web 的容器.

云栖大会SaaS加速器专场 | 阿里云资深技术专家黄省江:让天下没有难做的SaaS

导语:本文中,阿里云资深技术专家黄省江(花名禅笑)将聚焦“SaaS加速器——让天下没有难做的SaaS”,对伙伴来说,SaaS加速器帮助他们做好SaaS,卖好SaaS:对企业来说,SaaS加速器帮助他们选好SaaS,用好SaaS.同时,也全面展示了SaaS加速器的产品堆栈和最新成果. 上一Part辛总分享了阿里云不敢做SaaS的原因,顺着他的话题我来讲一下我的感受,确实我们是不敢做.不敢做不是因为To B的链条太长,毕竟阿里云现在有To B自有的产品,然后商业以及服务体系里面也建立了自己的一整套班

10个值得我们关注的python博客

大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建立这个博客的原因,向大家分享我自己学到的新知识.今天我向大家推荐10个值得我们关注的python博客,这些博客的博主都会定期的更新而且他们的文章都很不错.下面是博客列表: 1.首先第一个肯定是毋庸置疑的Planet Python这是最出名的python博客其中之一,快去看看,我希望你能找到对你有用的东西,昨天它还更新了呢! http://planetpython.org/ 2.第

值得你关注的Android8.0(Android O)上的重要变化

刚适配完Android7.0还没多久,就看到Google官方推出的Android8.0(Android O)的开发者预览版新闻,我的心情你可以好好想想.对于上层应用开发者的我来说,适配新版本的工作还好,而有JNI且有很多深层修改的人来说则是痛苦的.那么这一次的大版本更新,最终何时定型发布?她都带来了哪些新的限制与变化,对我们已有的应用有何影响?新增了什么特性,能否利用起来增加新奇有趣的功能呢? 本文在整理官方的Preview文档同时,运行部分示例代码,为各位一一展现.如果你英文还不错,时间也充裕

长沙Java培训实训的新选择--------阿里巴巴资深Java工程师任教

本公司目前正致力于职业社交.移动办公.企业信息化以及企业SNS等方面的互联网产品研发: 同时提供大学生软件技术的实训就业服务,不就业退全部学费; 公司由来自阿里巴巴资深java技术人员创立.技术以及管理经验非常丰富: 公司技术以及管理风格均参照阿里巴巴以及淘宝的体系,所以技术含量很高,管理风格现代化.欢迎各位加盟! 微信公众号:致观科技 官网QQ:2372081158 电话:0731-88031066 手机:18229976590 官网:www.zhiguanhome.com 地址:长沙市韶山南

C++开发者都应该使用的10个C++11特性

本文由 伯乐在线 - 治不好你我就不是兽医 翻译自 Marius Bancila.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. [感谢冯上(@治不好你我就不是兽医 )的热心翻译.如果其他朋友也有不错的原创或译文,可以尝试推荐给伯乐在线.] 在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛.不过我相信这些新特性当中有一些,应该成为所有C++开发者的常规装备.你也许看到过许多类似介绍各种C++11特性的文章.下面是我总结的,C++开发者都需要学习和使用的C++11

Java核心技术 卷1 读书笔记 (3 Java基本程序设计结构)

3.3 数据类型 Java是强类型语言,必须为每一个变量声明一种类型. 3.3.1 整型 Java 提供四种整型 int 4字节 short 2字节 long 8字节 byte 1字节 长整型(long)数值有一个后缀L(例如40000000000L),十六进制数值有一个前缀0x(例如0xCAFE),八进制数值有一个前缀0(例如010). 3.3.2 浮点型 Java提供两种浮点类型 float 4字节 double 8字节 float类型的数值有一个后缀F(例如3.42F),没有后缀F的浮点数

C++开发者都应该使用的10个C++11特性 转

http://blog.jobbole.com/44015/2013/07/26 | 分类: C/C++, 开发 | 5 条评论 | 标签: C++11, C语言 分享到: 127 本文由 伯乐在线 - 治不好你我就不是兽医 翻译自 Marius Bancila.未经许可,禁止转载! 欢迎加入:技术翻译小组,或分享原创到伯乐头条. [感谢冯上(@治不好你我就不是兽医 )的热心翻译.如果其他朋友也有不错的原创或译文,可以尝试推荐给伯乐在线.] 在C++11新标准中,语言本身和标准库都增加了很多新内

Android无线开发的几种常用技术(阿里巴巴资深工程师原创分享)

本文由阿里巴巴移动安全客户端.YunOS资深工程师Hao(嵌入式企鹅圈原创团队成员)撰写,是Hao在嵌入式企鹅圈发表的第一篇原创文章,对Android无线开发的几种常用技术进行综述. 嵌入式企鹅圈现拥有七个专栏(Linux内核驱动情景分析.资源紧缺型SOC嵌入式架构设计.嵌入式交叉工具链及其应用.嵌入式设计和编程.微信硬件平台和物联网解决方案.Android开发.开发资源共享).更多Android.Linux.嵌入式和物联网原创技术分享敬请关注微信公众号:嵌入式企鹅圈.我们百分百原创,资深工程师