建站目的,网站建设出找不到网页,电子商务网站建设文献,东莞横沥网站制作JAVA9新特性
Java 9发布于 2017 年 9 月 21 日 。
快速创建不可变集合
增加了List.of()、Set.of()、Map.of() 和 Map.ofEntries()等工厂方法来创建不可变集合#xff08;有点参考 Guava 的味道#xff09;#xff1a;
List.of(Java, C);
Set.of…JAVA9新特性
Java 9发布于 2017 年 9 月 21 日 。
快速创建不可变集合
增加了List.of()、Set.of()、Map.of() 和 Map.ofEntries()等工厂方法来创建不可变集合有点参考 Guava 的味道
List.of(Java, C);
Set.of(Java, C);
Map.of(Java, 1, C, 2);使用 of() 创建的集合为不可变集合不能进行添加、删除、替换、 排序等操作不然会报 java.lang.UnsupportedOperationException 异常。
String 存储结构优化
Java 8 及之前的版本String 一直是用 char[] 存储。在 Java 9 之后String 的实现改用 byte[] 数组存储字符串节省了空间。
public final class String implements java.io.Serializable,ComparableString, CharSequence {// Stable 注解表示变量最多被修改一次称为“稳定的”。Stableprivate final byte[] value;
}接口私有方法
Java 9 允许在接口中使用私有方法。这样的话接口的使用就更加灵活了有点像是一个简化版的抽象类。
public interface MyInterface {private void methodPrivate(){}
}try-with-resources 增强
在 Java 9 之前我们只能在 try-with-resources 块中声明变量
try (Scanner scanner new Scanner(new File(testRead.txt));PrintWriter writer new PrintWriter(new File(testWrite.txt))) {// omitted
}在 Java 9 之后在 try-with-resources 语句中可以使用 effectively-final 变量。
final Scanner scanner new Scanner(new File(testRead.txt));
PrintWriter writer new PrintWriter(new File(testWrite.txt))
try (scanner;writer) {// omitted
}什么是 effectively-final 变量 简单来说就是没有被 final 修饰但是值在初始化后从未更改的变量。
正如上面的代码所演示的那样即使 writer 变量没有被显示声明为 final但它在第一次被赋值后就不会改变了因此它就是 effectively-final 变量。
Stream Optional 增强
Stream 中增加了新的方法 ofNullable()、dropWhile()、takeWhile() 以及 iterate() 方法的重载方法。
Java 9 中的 ofNullable() 方法允许我们创建一个单元素的 Stream可以包含一个非空元素也可以创建一个空 Stream。 而在 Java 8 中则不可以创建空的 Stream 。
StreamString stringStream Stream.ofNullable(Java);
System.out.println(stringStream.count());// 1
StreamString nullStream Stream.ofNullable(null);
System.out.println(nullStream.count());//0takeWhile() 方法可以从 Stream 中依次获取满足条件的元素直到不满足条件为止结束获取。
ListInteger integerList List.of(11, 33, 66, 8, 9, 13);
integerList.stream().takeWhile(x - x 50).forEach(System.out::println);// 11 33dropWhile() 方法的效果和 takeWhile() 相反。
ListInteger integerList2 List.of(11, 33, 66, 8, 9, 13);
integerList2.stream().dropWhile(x - x 50).forEach(System.out::println);// 66 8 9 13iterate() 方法的新重载方法提供了一个 Predicate 参数 (判断条件)来决定什么时候结束迭代
public staticT StreamT iterate(final T seed, final UnaryOperatorT f) {
}
// 新增加的重载方法
public staticT StreamT iterate(T seed, Predicate? super T hasNext, UnaryOperatorT next) {}两者的使用对比如下新的 iterate() 重载方法更加灵活一些。
// 使用原始 iterate() 方法输出数字 1~10
Stream.iterate(1, i - i 1).limit(10).forEach(System.out::println);
// 使用新的 iterate() 重载方法输出数字 1~10
Stream.iterate(1, i - i 10, i - i 1).forEach(System.out::println);Optional 类中新增了 ifPresentOrElse()、or() 和 stream() 等方法
ifPresentOrElse() 方法接受两个参数 Consumer 和 Runnable 如果 Optional 不为空调用 Consumer 参数为空则调用 Runnable 参数。
public void ifPresentOrElse(Consumer? super T action, Runnable emptyAction)OptionalObject objectOptional Optional.empty();
objectOptional.ifPresentOrElse(System.out::println, () - System.out.println(Empty!!!));// Empty!!!or() 方法接受一个 Supplier 参数 如果 Optional 为空则返回 Supplier 参数指定的 Optional 值。
public OptionalT or(Supplier? extends Optional? extends T supplier)OptionalObject objectOptional Optional.empty();
objectOptional.or(() - Optional.of(java)).ifPresent(System.out::println);//java进程 API
Java 9 增加了 java.lang.ProcessHandle 接口来实现对原生进程进行管理尤其适合于管理长时间运行的进程。
// 获取当前正在运行的 JVM 的进程
ProcessHandle currentProcess ProcessHandle.current();
// 输出进程的 id
System.out.println(currentProcess.pid());
// 输出进程的信息
System.out.println(currentProcess.info());响应式流 Reactive Streams
在 Java 9 中的 java.util.concurrent.Flow 类中新增了反应式流规范的核心接口 。
Flow 中包含了 Flow.Publisher、Flow.Subscriber、Flow.Subscription 和 Flow.Processor 等 4 个核心接口。Java 9 还提供了SubmissionPublisher 作为Flow.Publisher 的一个实现。
变量句柄
变量句柄是一个变量或一组变量的引用包括静态域非静态域数组元素和堆外数据结构中的组成部分等。
变量句柄的含义类似于已有的方法句柄 MethodHandle 由 Java 类 java.lang.invoke.VarHandle 来表示可以使用类 java.lang.invoke.MethodHandles.Lookup 中的静态工厂方法来创建 VarHandle 对象。
VarHandle 的出现替代了 java.util.concurrent.atomic 和 sun.misc.Unsafe 的部分操作。并且提供了一系列标准的内存屏障操作用于更加细粒度的控制内存排序。在安全性、可用性、性能上都要优于现有的 API。