Java11 发布前抓紧掌握这些新特性

时间:2022-03-05 10:15:54

快速回顾
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本身由模块组成。

?
1
2
3
4
5
6
~ 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. 编写代码

?
1
2
3
4
5
6
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 发布前抓紧掌握这些新特性

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

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

?
1
2
3
module main.module {
requires first.module;
}

main文件代码:

?
1
2
3
4
5
6
7
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

?
1
2
3
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中有效:

?
1
2
3
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。

结论
我们已经看到了从java 8到java 10的历程以及java受其他函数和脚本语言的影响。 java是一种强大的面向对象编程语言,同时,它现在支持许多功能型结构。 java不仅会带来其他语言的*功能,还会不断改进内部功能。 它正以极快的速度发展,保持跟进——在它逐步淘汰之前! 因为,java 11、12已在路上!
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。如果你想了解更多相关内容请查看下面相关链接

原文链接:https://www.toutiao.com/i6599664767789433348/