- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章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本身由模块组成.
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 。
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/ 。
最后此篇关于Java11 发布前抓紧掌握这些新特性的文章就讲到这里了,如果你想了解更多关于Java11 发布前抓紧掌握这些新特性的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想知道有没有可能做 new PrintWriter(new BufferedWriter(new PrintWriter(s.getOutputStream, true))) 在 Java 中,s
我正在尝试使用 ConcurrentHashMap 初始化 ConcurrentHashMap private final ConcurrentHashMap > myMulitiConcurrent
我只是想知道两个不同的新对象初始化器之间是否有任何区别,还是仅仅是语法糖。 因此: Dim _StreamReader as New Streamreader(mystream) 与以下内容不同: D
在 C++ 中,以下两种动态对象创建之间的确切区别是什么: A* pA = new A; A* pA = new A(); 我做了一些测试,但似乎在这两种情况下,都调用了默认构造函数,并且只调用了它。
我已经阅读了其他帖子,但它们没有解决我的问题。环境为VB 2008(2.0 Framework)下面的代码在 xslt.Load 行导致 XSLT 编译错误下面是错误的输出。我将 XSLT 作为字符串
我想知道为什么alert(new Boolean(false))打印 false 而不是打印对象,因为 new Boolean 应该返回对象。如果我使用 console.log(new Boolean
本文实例讲述了Python装饰器用法。分享给大家供大家参考,具体如下: 写装饰器 装饰器只不过是一种函数,接收被装饰的可调用对象作为它的唯一参数,然后返回一个可调用对象(就像前面的简单例子) 注
我可以编写 YAML header 来使用 knit 为 R Markdown 文件生成多种输出格式吗?我无法重现 the original question with this title 的答案中
我可以编写一个YAML标头以使用knitr为R Markdown文件生成多种输出格式吗?我无法重现the original question with this title答案中描述的功能。 这个降价
我正在使用vars package可视化脉冲响应。示例: library(vars) Canada % names ir % `$`(irf) %>% `[[`(variables[e])) %>%
我有一个容器类,它有一个通用参数,该参数被限制到某个基类。提供给泛型的类型是基类约束的子类。子类使用方法隐藏(新)来更改基类方法的行为(不,我不能将其设为虚拟,因为它不是我的代码)。我的问题是"new
Java 在提示! cannot find symbol symbol : constructor Bar() location: class Bar JPanel panel =
在我的应用程序中,一个新的 Activity 从触摸按钮(而不是点击)开始,而且我没有抬起手指并希望在新的 Activity 中跟踪触摸的 Action 。第二个 Activity 中的触摸监听器不响
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,
和我的last question ,我的程序无法检测到一个短语并将其与第一行以外的任何行匹配。但是,我已经解决并回答了。但现在我需要一个新的 def函数,它删除某个(给定 refName )联系人及其
这个问题在这里已经有了答案: Horizontal list items (7 个答案) 关闭 9 年前。
我想创建一个新的 float 类型,大小为 128 位,指数为 4 字节(32 位),小数为 12 字节(96 位),我该怎么做输入 C++,我将能够在其中进行输入、输出、+、-、*、/操作。 [我正
我在放置引用计数指针的实例时遇到问题 类到我的数组类中。使用调试器,似乎永远不会调用构造函数(这会扰乱引用计数并导致行中出现段错误)! 我的 push_back 函数是: void push_back
我在我们的代码库中发现了经典的新建/删除不匹配错误,如下所示: char *foo = new char[10]; // do something delete foo; // instead of
A *a = new A(); 这是创建一个指针还是一个对象? 我是一个 c++ 初学者,所以我想了解这个区别。 最佳答案 两者:您创建了一个新的 A 实例(一个对象),并创建了一个指向它的名为 a
我是一名优秀的程序员,十分优秀!