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

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。

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

(0)

相关推荐

  • Java 10的10个新特性总结

    Java 9才发布几个月,很多玩意都没整明白,现在Java 10又要来了. 这时候我真想说:线上用的JDK 7,甚至JDK 6,而JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK 10-- 刚学Java的同学是不是感觉一脸蒙逼? 就连我这个老司机也同样感觉如此! Java 更新越来越快,我们做技术的也要跟上步伐,不然总会慢别人一拍,这新东西从国外到国内应用一般要好几年的时间,如果我们提前了解并应用这些新技术对自己不是坏事. Java 10的新特性 说了这么多,看Java 10都会

  • 详解Java8新特性之interface中的static方法和default方法

    为什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Collection中的default方法.所以准备专门写写关于java8新特性的文章,虽然现在10已经发布了.但还是要认真的去了解下新版本的变化. static方法 java8中为接口新增了一项功能:定义一个或者更多个静态方法.用法和普通的static方法一样. 代码示例 public interface

  • Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

    美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本.非常值得大家的关注,可以通过下面的地址进行下载: https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html 为什么说是长期版本,看下面的官方发布的支持路线图表. 可以看出 Java 8 扩展支持到 2025 年,而 Java 11 扩展支持到 2026 年. 现在大部

  • Java11新特性之HttpClient小试牛刀

    序 本文主要研究一下Java11的HttpClient的基本使用. 变化 从java9的jdk.incubator.httpclient模块迁移到java.net.http模块,包名由jdk.incubator.http改为java.net.http 原来的诸如HttpResponse.BodyHandler.asString()方法变更为HttpResponse.BodyHandlers.ofString(),变化一为BodyHandler改为BodyHandlers,变化二为asXXX()之

  • Java8新特性Stream流实例详解

    什么是Stream流? Stream流是数据渠道,用于操作数据源(集合.数组等)所生成的元素序列. Stream的优点:声明性,可复合,可并行.这三个特性使得stream操作更简洁,更灵活,更高效. Stream的操作有两个特点:可以多个操作链接起来运行,内部迭代. Stream可分为并行流与串行流,Stream API 可以声明性地通过 parallel() 与sequential() 在并行流与顺序流之间进行切换.串行流就不必再细说了,并行流主要是为了为了适应目前多核机器的时代,提高系统CP

  • Java8中接口的新特性测试

    在Java SE 8之前,接口中是不能提供方法实现的,但是JDK8提供了接口的默认方法和静态方法的支持. 默认方法 方法前加default关键字就可以提供默认实现,类实现接口时,可以继承接口的默认方法,也可以覆盖默认方法. interface People { default void eat(String name) { System.out.println(name + " is eating."); } } 抽象类也可以提供方法的默认实现,一个类可以同时继承一个抽象类和多个接口,

  • 详解Java8 新特性之日期API

    Java 8 在包java.time下包含了一组全新的时间日期API.下面的例子展示了这组新API里最重要的一些部分: 1.Clock 时钟 Clock类提供了访问当前日期和时间的方法,Clock是时区敏感的,可以用来取代 System.currentTimeMillis() 来获取当前的微秒数.某一个特定的时间点也可以使用Instant类来表示,Instant类也可以用来创建老的java.util.Date对象. Clock clock = Clock.systemDefaultZone();

  • Java8深入学习系列(三)你可能忽略了的新特性

    前言 我们之前已经介绍了关于java8中lambda和函数式编程的相关内容,虽然我们开始了Java8的旅程,但是很多人直接从java6上手了java8, 也许有一些JDK7的特性你还不知道,在本章节中带你回顾一下我们忘记了的那些特性. 尽管我们不能讲所有特性都讲一遍,挑出常用的核心特性拎出来一起学习. 异常改进 try-with-resources 这个特性是在JDK7种出现的,我们在之前操作一个流对象的时候大概是这样的: try { // 使用流对象 stream.read(); stream

  • Java8中新特性Optional、接口中默认方法和静态方法详解

    前言 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性. Java 8是Java的一个重大版本,有人认为,虽然这些新特性领Java开发人员十分期待,但同时也需要花不少精力去学习.下面本文就给大家详细介绍了Java8中新特性Optional.接口中默认方法和静态方法的相关内容,话不多说了,来一起看看详细的介绍吧. Optional Optional 类(java.util.Optional) 是一个

  • Java8新特性Lambda表达式的一些复杂用法总结

    简介 lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的"函数式编程". 它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数. 本文将介绍关于Java8 Lambda表达式的一些复杂用法,分享出来供大家参考学习,下面来一起看看详细的介绍: 复杂用法实例 传入数组ids,在list<Obj>上操作,找出Obj中id想匹配的,并且按

随机推荐