

Java9的9个新特性
source link: http://javakk.com/1406.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Java8发布三年多后,下一个版本即将发布,暂定发布日期为2017年9月21日。您可能听说过Java9的模块系统,但这个新版本还有更多的内容。下面是Java9将提供的9个令人兴奋的新特性。
1. Java平台模块系统
Java9的定义特性是一个全新的模块系统。当代码基变得更大时,创建复杂、纠结的“意大利面代码”的几率就会成倍增加。有两个基本问题:很难真正地封装代码,而且系统的不同部分(JAR文件)之间没有显式依赖关系的概念。每个公共类都可以被类路径上的任何其他公共类访问,这会导致无意中使用不应该是公共API的类。此外,类路径本身也有问题:您如何知道是否所有必需的jar都在那里,或者是否有重复的条目?模块系统解决了这两个问题。
模块化JAR文件包含一个额外的模块描述符。在这个模块描述符中,对其他模块的依赖关系通过' requires
'语句表示。此外,` exports
`语句控制其他模块可以访问哪些包。默认情况下,所有未导出的包都封装在模块中。下面是一个模块描述符的示例,它位于“module-info.java`:
module blog { exports com.pluralsight.blog; requires cms; }
我们可以将这些模块可视化如下:
请注意,这两个模块都包含封装的包,因为它们没有导出(用橙色盾牌显示)。没有人会意外地使用这些包中的类。Java平台本身也使用自己的模块系统进行了模块化。通过封装JDK内部类,该平台更加安全,并且更容易升级。
当启动一个模块化应用程序时,JVM会验证是否所有模块都可以基于' requires
'语句进行解析,这比脆弱的类路径有了很大的进步。模块允许您通过强大的封装和显式依赖性实现更好的应用程序结构。通过本篇文章,您可以了解更多有关在Java9中使用模块的信息。
2. 链接
当您拥有具有显式依赖关系的模块和模块化的JDK时,就会出现新的可能性。您的应用程序模块现在声明它们对其他应用程序模块及其从JDK使用的模块的依赖关系。为什么不使用这些信息来创建一个最小的运行时环境,只包含运行应用程序所需的那些模块?在Java9中,新的 jlink 工具使这成为可能。您可以创建一个针对应用程序优化的最小运行时映像,而不是使用完全加载的JDK安装来交付应用程序。
3. JShell:交互式java REPL
许多语言已经有了一个交互式的Read-Eval-Print循环,Java现在也加入了这个俱乐部。您可以从控制台启动jshell并直接开始键入和执行Java代码。jshell的即时反馈使它成为探索api和尝试语言特性的好工具。
测试Java正则表达式是jshell如何让您的生活更轻松的一个很好的例子。交互式shell还提供了一个很好的教学环境和生产力提升,您可以在本网络研讨会中了解更多。当你教人们如何编写Java代码时,你不再需要解释这个“ publicstaticvoidmain(String[]args)
”的无稽之谈。
4. 改进的Javadoc
有时是一些小事能起到很大的作用。你有没有像我一样一直用Google来找到合适的Javadoc页面?那已经没有必要了。Javadoc现在在API文档本身中包含了搜索权。另外,Javadoc输出现在与HTML5兼容。另外,您会注意到每个Javadoc页面都包含关于类或接口来自哪个JDK模块的信息。
5. 集合工厂方法
通常,您希望在代码中创建一个集合(例如,列表或集合),并用一些元素直接填充它。这会导致重复的代码,其中实例化集合,然后是几个“add”调用。在Java 9中,添加了几个所谓的集合工厂方法:
Set<Integer> ints = Set.of(1, 2, 3); List<String> strings = List.of("first", "second");
除了更简短、更易于阅读之外,这些方法还使您不必选择特定的集合实现。事实上,从工厂方法返回的集合实现针对您放入的元素数量进行了高度优化。这是可能的,因为它们是 不可变 的:在创建后将项添加到这些集合会导致“ UnsupportedOperationException ”。
6. Streams API改进
Streams API可以说是Java标准库长期以来最好的改进之一。它允许您在集合上创建转换的声明性管道。使用Java9,这只会变得更好。流接口中添加了四个新方法: dropWhile
、 takeWhile
和 ofNullable
。 iterate
方法获得一个新的重载,允许您提供一个关于何时停止迭代的谓词:
IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);
第二个参数是lambda,它返回true,直到 IntStream
中的当前元素变为100。因此,这个简单的示例在控制台上打印整数1到99。
除了对流本身的这些添加之外, Optional
和 Stream
之间的集成也得到了改进。现在可以使用 Optional
上的新“Stream”方法将可选对象转换为(可能是空的)流:
Stream<Integer> s = Optional.of(1).stream();
在组合复杂的流管道时,将可选的转换为流尤其有用。
7. 专用接口方法
Java8为我们带来了接口上的默认方法。接口现在也可以包含行为,而不仅仅是方法签名。但是,如果在一个接口上有几个默认方法,而这些方法的代码几乎做相同的事情,会发生什么呢?通常,您会重构这些方法来调用包含共享功能的私有方法。但是默认方法不能是私有的。使用共享代码创建另一个默认方法不是解决方案,因为这个 helper
方法成为公共API的一部分。使用Java 9,您可以向接口添加私有方法来解决此问题:
public interface MyInterface { void normalInterfaceMethod(); default void interfaceMethodWithDefault() { init(); } default void anotherDefaultMethod() { init(); } // This method is not part of the public API exposed by MyInterface private void init() { System.out.println("Initializing"); } }
如果您正在使用默认方法开发api,那么私有接口方法可以有助于构建它们的实现。
8. HTTP2协议
Java9提供了一种执行HTTP调用的新方法。这个过期已久的“ HttpURLConnection
”API替代品还支持WebSockets和HTTP/2开箱即用。一个警告:新的HttpClient API在java9中作为所谓的孵化器模块交付。这意味着API还不能保证是100%最终版本。不过,随着Java 9的到来,您已经可以开始使用以下API:
HttpClient client = HttpClient.newHttpClient(); HttpRequest req = HttpRequest.newBuilder(URI.create("http://www.google.com")) .header("User-Agent","Java") .GET() .build(); HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());
除了这个简单的请求/响应模型之外,HttpClient还提供了新的api来处理HTTP/2特性,比如流和服务器推送。
9. 多版本 JARs
我们强调的最后一个特性对于库维护人员来说是一个特别好的消息。当Java的新版本出现时,您库的所有用户都需要几年时间才能切换到这个新版本。这意味着库必须向后兼容您想要支持的最旧版本的Java(例如,在许多情况下是java6或java7)。这实际上意味着您很长一段时间内都无法在库中使用Java9的新特性。幸运的是,multi-release JAR特性允许您创建仅在特定Java版本上运行库时使用的类的备用版本:
multirelease.jar ├── META-INF │ └── versions │ └── 9 │ └── multirelease │ └── Helper.class ├── multirelease ├── Helper.class └── Main.class
在这种情况下,多版本.jar可以在Java9上使用,而不是顶级多重释放帮助程序类,则使用“META-INF/versions/9”下的一个。这个类的java9特定版本可以使用java9特性和库。同时,在早期的Java版本上使用这个JAR仍然有效,因为早期的Java版本只能看到顶级的 Helper
类。
Recommend
-
43
JShell是什么? 引入JDK官方的Summary: Provide an interactive tool to evaluate declarations, statements, and expressions of the Java program
-
49
2018比2008整整大了十轮,今年似乎有点特殊发生了很多事情,但又依稀上演着历史翻拍过的场景,接下来从:世界、产品、复盘娓娓道来。 世界:我们走在历史中的转折点,每年都很重要,今年只是开始。 关键词1:贸易战 中国经济仍以每年7%的增速高于美国,历史何其相...
-
39
1: finalize() 方法 finallize() 方法是Object类的方法, 用于在类被GC回收时 做一些处理操作, 但是JVM并不能保证finalize(0 ) 方法一定被执行, 由于finalize()方法的调用时机具有不确定性,从一个对象变得不可到...
-
22
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得...
-
16
专栏总结java9:MyBatis+hibernate_黄规速博客:学如逆水行舟,不进则退-CSDN博客 ...
-
7
1. 概述 Java9在包之上引入了一个新的抽象级别,正式称为Java平台模块系统(JPMS),简称“模块”。 在本文中,我们将...
-
2
Completable Future Improvements in Java9 Reading Time: 3 minutesIn this article, I will be talking about the improvements...
-
8
Why to use Java9 when I have Java8? Reading Time: 3 minutes The concept of JPMS i.e. Java Platform Module System came in J...
-
3
5分钟学会Java9-Java11的七大新特性 - 云信博客 > IM即时通信 > 5分钟学会Java9-Java11的七大新特性
-
2
Java9私有接口方法详解 Java...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK