程序员们,再不升级 Java 10 就晚了!

毕竟,Java 11 快来了!

正如我们大家都知道的,Java 的最新版本已经来到了10。本文将重点介绍当前正在开发的一些有趣的 Java 新功能。

Oracle 官方宣称在每年的三月和九月将分别发布两次 Java 的新版本。这意味着 Java 11 将在五个月内面世。得益于如此频繁的发布速度,只要有新功能便会立即加入到新版的 Java 中,这样一来开发者就可以很快享有 Java 的新功能,而不必再像以前那样等待多年。Java 10的发布相比于 Java 9 只有短短的六个月,然而我们在 Java 10中看到了大量的新功能。对于即将发布的 Java 11,我们同样期待能够有更多的新功能加入。

如今,这些新功能能够快速在 Java 新版本中发布,那么这些新功能到底有哪些?本文将重点介绍当前正在开发和提及的一些有趣的 Java 新功能。

▌局部变量类型推断

Java 10 引入了局部变量类型推断的特性。该特性使用var关键字来定义局部变量,并让编译器根据初始化的方式来确定变量类型。如果你使用过 Java 的 lambda 表达式,那么这个特性对你来说并不会太陌生。实际上,你可能已经将它作为 lambda 参数声明的一部分来执行过:

Function<String, String> foo = (s) -> s.toLowerCase();

通过这段代码你会发现没有必要把 s 定义为 String,它的类型会由编译器自动推断出来。使用 Java 10,你可以编写如下代码:

var list = new ArrayList<String>();

编译器会推断 list 是 ArrayList 类型。使用 var关键字可以帮助你减少一些代码的冗长度,尤其是泛型已经存在于变量初始化或者变量名称中时。它容易获得且易于理解,不必依靠 IDE 来告诉你变量的具体类型。

Java 11会进一步增强这一点,所以var也是 lambda 参数的合法类型,这意味着前面提到的 lambda 也可以写成 (var s) -> s.toLowerCase();。你可能会问为什么可以这么写,实际上,忽略类型的效果是一样的。一个主要的原因是,有一个类型的话意味着你可以注释得更好。

具体哪些情况应该使用var,请阅读 Stuart Marks 的风格指南。

  • http://openjdk.java.net/projects/amber/LVTIstyle.html

▌原始字符串文字

目前另一项增强功能被提出并正在积极研究中,那就是原始字符串文字功能。在原始字符串中,字符串中的每个字符都按原样读取,包括换行符!这个功能对于那些需要大量转义或者跨越多行的字符串来说特别有用。例如,这可以是硬编码的 HTML 或 SQL 查询:

String html = "\n" + " \n" + "

Hello World.

\n" + " \n" + "\n";

有了原始字符串文字特性,以上代码可以写成这样:

String html = `<html> <body> <p>Hello World.p> body> html> `;

在新的语法中当,反引号(`)用作原始字符串符号。如果你需要在字符串文本中使用反引号,则只需使用双反引号将字符串包围起来,或者三元、四元反引号也可以,只要开始和结束的反引号数量相同即可。

String str =This is a raw string with backticks inside;

虽然原始字符串文字尚未加入 JEP,但是添加该特性所需的很多帮助方法目前正在添加到 Java 11的字符串中,这表明原始字符串文字可能会在 Java 11 中呈现给大家。

▌switch 表达式

有关 switch 语句的多项改进正在进行,其中就包括了全开模式匹配。我对 switch 表达式充满期待。如果你曾经写过 switch 语句,那么代码可能是这样的:

int val; switch (str) { case "foo": val = 1; break; case "bar": val = 2; break; case "baz": val = 3; break; default: val = -1; }

有了 switch 表达式,上面的代码可以简化为:

int val = switch (str) { case "foo": break 1; case "bar": break 2; case "baz": break 3; default: break -1; }

这意味着 break 语句能够获得 switch 表达式的结果值,就像 return 获得方法的返回值一样。在以上例子中,break 是 case 的唯一语句,如果继续简化,一种类似 lambda 语法的写法可以将上述代码改为:

int val = switch (str) { case "foo" -> 1; case "bar" -> 2; case "baz" -> 3; default -> -1; }

如上所述,添加 switch 表达式是模式匹配的一个步骤,它使你不仅能够切换编译时常量,还可以是类型、条件检查等等。

目前 switch 表达式已经实现了,经过测试、代码审查和批准之后,相信将其发布到 JDK 中只是一个时间问题。离 Java 11发布还有足够长的时间,在 Java 11中加入 switch 表达式应该没问题。

▌其他变化

除了上述提到的语言变化之外,还有很多其他的东西可能在近期或者不远的将来出现在 Java 的新版本中。JEP 的提案越来越多,比如支持枚举泛型类型参数的增强枚举、前文已经提到的模式匹配、动态调用、值类型,等等。

如何将单个文件类作为脚本启动,类似于shell、Perl 或者 Python 脚本在命令行的运行方式一样?Java 后台引擎也进行了很多改进。这包括对 JVM 本身的更改,这样的更改对语言层面不会有影响,例如新的超低延迟 GC,用于与本机代码更好地实现互操作性的 API,改变内部类在 JVM 级别(基于嵌套的访问控制)以及一些其他的改进。

那么,我们什么时候可以看到这些新功能呢?答案是未来的3月或者9月。有些功能确实相互依赖,但是随着新版本的发布,从功能准备就绪到我们获得支持它的 JVM 版本之间的时间很快。

至于语言和平台的快速发展对 Java 是否有益,相信读者心中有数。

原文发布于微信公众号 - IT派(transfer_3255716726)

原文发表时间:2018-06-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏算法与数据结构

利用代码计算原码,反码和补码

1083
来自专栏技术总结

iOS优化_你可能没注意到的delegate

1905
来自专栏Golang语言社区

论golang是世界上最好的语言

概述 golang is a better C and a simple C++ golang主要特性 1、语法简单 舍弃语法糖,严格控制关键字 C++语法糖之...

4099
来自专栏Crossin的编程教室

【Python 第23课】 if, elif, else

今天补充之前讲过的一个语句:if。为什么我跳要着讲,因为我的想法是先讲下最最基本的概念,让你能用起来,之后你熟悉了,再说些细节。 关于if,可以发送数字『7』回...

2836
来自专栏Web 开发

JavaScript Cookbook 2nd 之 Function

昨晚翻了一下,虽然都是一些旧知识,不过深入下去对照着其他资料一起看,还是能发现一些有意思的地方。

910
来自专栏做全栈攻城狮

程序员带你十天快速入门Python,玩转电脑软件开发(四)

本系列文章立志于从一个已经习得一门编程语言的基础之上,全面介绍Python的相关开发过程和相关经验总结。本篇文章主要是基于上一篇的程序员带你十天快速入门Pyth...

1084
来自专栏AndroidTv

谈谈你对 Java 平台的理解声明提问正文

1124
来自专栏锦小年的博客

python学习笔记1-理解Python语言

本章主要介绍一下python语言的相关知识,包括其语言类型、作为面向对象的3大特性以及5大原则,在末尾介绍了其优缺点。 python是解释型的脚本语言 解...

2119
来自专栏java学习

java每日一练(2017/8/20)

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Android视频更新了!(回复【安卓视频】获取下载链接) ●【新】Ajax知识点视频更新了!(回复【学习...

3016
来自专栏java一日一条

Java 中的十个”单行代码编程” ( One Liner )

本文列举了十个使用一行代码即可独立完成(不依赖其他代码)的业务逻辑,主要依赖的是Java8中的Lambda和Stream等新特性以及try-with-resou...

972

扫码关注云+社区

领取腾讯云代金券