Java11有哪些新特性

发布时间:2021-09-09 10:37:13 作者:小新
来源:亿速云 阅读:166

这篇文章给大家分享的是有关Java11有哪些新特性的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。


1.Lambda表达式: (参数) -> {主体}
Lambda表达式打开了函数式编程爱好者继续使用Java的大门。Lambda表达式需要零个或多个参数,这些参数可以在表达式主体中访问,并随计算结果一起返回。
Comparator<Integer> comparator = (a, b) -> a-b;
System.out.println(comparator.compare(3, 4)); // -1

2. 函数接口:只有一种方法的接口
lambda表达式本身被视为可以分配给函数接口的功能接口,如上所示。Java 8还提供了如下所示的新功能构造:
BiFunction<Integer, Integer, Integer> comparator = (a, b) -> a-b;
System.out.println(comparator.apply(3, 4)); // -1
有关更多功能结构,请参阅java.util.function包,其拥有:Function,Supplier,Consumer,Predicate等。还可以使用下面注解来定义函数接口:
@FunctionalInterface
接口还可以具有方法的一个或多个默认实现,并且仍然可以保持为函数接口。它有助于避免不必要的抽象基类的默认实现。
可以使用::操作符访问静态和实例方法,并且可以使用 ::new访问构造函数,并且可以将它们作为函数参数传递,例如System.out::println .
3.流:不仅仅是迭代
流是一系列对象和操作。 接口中添加了许多默认方法,以支持流的forEach, filter, map和reduce构造。提供集合的Java库现在支持流。 例如 BufferredReader.lines()。 所有集合都可以轻松转换为流。 还支持并行流操作,它在内部分配到多个CPU上的操作。
1)中间操作:懒惰性操作
对中间操作的懒惰执行时,在调用终止操作之前不会发生任何事情。
map(mapping):每个元素是一对一的,并转换为另一种形式。
filter(predicate):给定谓词为true的过滤元素。
peek(),limit()和sorted()是其他中间操作。
2)终止操作:结果化操作
forEach(consumer):遍历每个元素并消费该元素
reduce(initialValue,accumulator):它以initialValue开头,并在每个元素上迭代,并以最终返回的值来保持值更新。
collect(collector):这是一个懒惰的评估结果,需要使用收集器收集,例如java.util.stream.Collectors,包括toList(),join(),summarizingX(),averagingX(),groupBy(), 和partitionBy()。
4. Optional:消除Null编程
基于Null的编程被认为是糟糕的,但几乎没有任何选择可以提前避免它。我们现在可以在Optional对象中测试isPresent(),而不是测试null。 读取它(流也有多个构造和操作)返回Optional对象。
5. JVM变化:PermGen已退役
PermGen已被完全删除并被MetaSpace取代。 元空间(Metaspace)不再是堆内存的一部分,而是分配给进程的本机内存的一部分。 JVM调优现在需要不同的方面,因为监控是必需的,不仅对于堆,而且也包括对本机内存。
某些GC的组合已弃用。 GC根据环境配置自动分配。
还有其它的变化,包括NIO、DateTime、Security、简洁的JDK配置文件以及jDeps,jjs,JavaScript Engine工具等。
6.Java 9:延续上一版惯例
Java 9已经存在了一年多了,继续保持8的传统。 但它的关键特征模块系统仍然没有很好地被采用。 在我看来,在主流中真正采用这些功能还需要更多时间。 它以设计类的方式挑战开发人员。 他们现在需要在应用程序模块方面考虑更多,而不仅仅是一组类。 无论如何,这是传统开发人员通过基于微服务的开发所面临的类似挑战。 Java 9继续添加函数式编程功能,以保持Java的活力并改进JVM内部。
1)Java平台模块系统:小即是大
Java 9最着名的特性是Java平台模块系统(JPMS)。 这是迈向真正封装的重要一步。 把一个大模块打破为由密切相关的代码和数据组成的小而清晰的模块。 它类似于OSGi包,其中每个包定义它消耗的依赖关系并公开其他模块所依赖的东西。
它引入了编译和运行时之间的装配阶段,可以构建JDK和JRE的自定义运行时映像。 现在,JDK本身由模块组成。

~ java --list-modules
java.activation@9.0.2
java.base@9.0.2
java.compiler@9.0.2
java.corba@9.0.2
...

这些模块称为系统模块。 没有模块信息的jar被加载到未命名的模块中。 我们可以通过在文件module-info.java中提供以下信息来定义我们自己的应用程序模块:
requires—依赖于其他模块
exports—导出模块中包的公共API/接口
opens— 打开反射访问包
uses— 类似requires。
要了解更多信息,请参阅快速入门指南()。
2)创建模块示例
以下是IntelliJ IDE中的快速步骤:
1. 在IntelliJ创建模块: 到File > New > Module - "first.module"
2. 在模块下的src中创建java类(/first.module/src)
3. 编写代码

package com.test.modules.print;
public class Printer {
public static void print(String input){
System.out.println(input);
}
}

4. 添加module-info.java : /first.module/src > New > package

Java11有哪些新特性

module first.module {
exports com.test.modules.print; // 导出包的公共apis.
}

5. 与前面相似,创建模块 " main.module " 和 Main.java :

module main.module {
requires first.module;
}

Main文件代码:

package com.test.modules.main;
import com.test.modules.print.Printer;
public class Main {
public static void main(String[] args) {
Printer.print("Hello World");
}
}

6. IntelliJ自动编译它并记录依赖项和--module-source-path
7.要运行Main.java,它需要--module-path或-m

java -p /Workspaces/RnD/out/production/main.module:/Workspaces/RnD/out/production/first.module -m main.module/com.test.modules.main.Main
Hello World
Process finished with exit code 0

所以,通过这种方式,我们就可以定义模块了。
3)其它新特性
Java 9附带了许多其他功能。 下面列出了一些重要的部分(也是为了追赶竞争对手):
响应式编程 - Java 9引入了响应流,它支持React,就像发布者和消费者之间的异步/等待通信一样。 它在Flow类中添加了标准接口。
JShell- Java Shell - 就像任何其他脚本语言一样,Java现在可以用作脚本语言。
流和集合增强:Java 9添加了一些与"有序"和"可选"流操作相关的API。 添加of()操作以简化创建集合,就像JavaScript一样。
JVM自我调优
G1是默认的GC,GC中的自我调优功能也有所改进。CMS已被弃用。
访问堆栈
StackWalker类被添加到对堆栈帧的延迟访问中,我们可以遍历并过滤到它。
多发行版JAR文件:MRJAR
一个Java程序可能包含与多个版本兼容的类。 说实话,我不确定这个功能有多么有用。
7.Java 10:更接近函数型语言
1)类型推断
Java 10带来了JavaScript的var。 您不仅可以自由声明变量的类型,还可以自由的构建集合类型。 以下内容在Java 10中有效:

var test = "9";
test = 1.0;
var set = Set.of(5, "X", 6.5, new Object());

代码变得越来越冗长,脚本语言的魔力越来越多地被添加到Java中。 它肯定会给Java带来这些功能的负面影响,但它给开发人员带来了很多动力。
2)更强大的JVM
在并行情况下,GC完全触发G1以提高整体性能。
堆分配可以在连接到系统的备用存储设备上分配。 它将有助于确定系统上Java进程的优先级。 与重要的优先级相比,低优先级的存储器可以使用慢速存储器。
java 10还改进了本地握手线程中的线程处理。 还增加了前期编译(实验性的)。 针对循环生成增强的字节码是Java 10的另一个有趣特性。
3)增强的语言级特性
在Java 10中,我们改进了Optional、不可修改的集合API。

感谢各位的阅读!关于“Java11有哪些新特性”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

推荐阅读:
  1. Java11的HttpClient的特性是什么
  2. Java11的新特性是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Java虚拟机GC日志分析的案例

下一篇:怎么通过重启路由的方法切换IP地址

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》