您的位置 首页 java

Java 9(2017年9月22号)

模块系统

模块化最大的意义就是按照功能把代码逻辑分割开来,实际运用主要用来系统瘦身、依赖jar级别的隔离。语法上类似于VUE,多了 exports、requires、uses、opens 关键字。

JShell

交互式的编程环境

改进Javadoc

Javadoc导出文件现在支持在 API 文档中的进行搜索

多版本兼容 JAR 包

多版本兼容 JAR 功能能让你创建仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本

 javac --release 9 java9/com/runoob/Tester.java
javac --release 7 java7/com/runoob/Tester.java
jar -c -f test.jar -C java7 .  --release 9  -C java9.
  

集合工厂方法

List,Set 和 Map 接口中,新的静态工厂方法可以创建这些集合的不可变实例

 Set<String> set = Set.of("A","B","C");
List<String> list = List.of("A","B","C");
Map<String,String> map = Map.of("A","Apple","B","Boy","C","Cat");
  

私有接口方法

在 Java 8 接口引入了默认方法和静态方法,仅仅需要使用 default 关键字来定义它们,Java 9 不仅像 Java 8 一样支持接口默认方法,同时还支持私有方法。

改进的进程 API

在 Java 9 之前,Process API 仍然缺乏对使用本地进程的基本支持,例如获取进程的 PID 和所有者,进程的开始时间,进程使用了多少 CPU 时间,多少本地进程正在运行等。

 ProcessBuilder pb = new ProcessBuilder("notepad.exe");
String np = "不存在";
Process p = pb.start();
ProcessHandle.Info info = p.info();
System.out.printf("Process ID : %s%n", p.pid()); // 获取进程PID
System.out.printf("Command name : %s%n", info.command().orElse(np)); // 获取进程名称
System.out.printf("Command line : %s%n", info.commandLine().orElse(np)); // 获取进程命令行
System.out.printf("Start time: %s%n",
  info.startInstant().map(i -> i.atZone(ZoneId.systemDefault())
  .toLocalDateTime().toString()).orElse(np)); // 获取进程启动时间
System.out.printf("Arguments : %s%n",
  info.arguments().map(a -> Stream.of(a).collect(
  Collectors.joining(" "))).orElse(np)); // 获取进程参数
System.out.printf("User : %s%n", info.user().orElse(np)); // 获取进程用户
  

改进的 Stream API

改进的 Stream API 添加了一些便利的方法,使流处理更容易,并使用收集器编写复杂的查询。
Java 9 为 Stream 新增了几个方法:dropWhile、takeWhile、ofNullable,为 iterate 方法新增了一个重载方法。

takeWhile

takeWhile使用一个断言作为参数,返回给定 Stream 的子集直到断言语句第一次返回 false

 Stream.of("a","b","c","","e","f").takeWhile(s->!s.isEmpty())
  .forEach(System.out::print); // 打印abc
  

dropWhile

dropWhile使用一个断言作为参数,直到断言语句第一次返回 false 才返回给定 Stream 的子集

 Stream.of("a","b","c","","e","f").dropWhile(s->!s.isEmpty())
  .forEach(System.out::print); // 打印ef
  

iterate

使用初始种子值创建顺序流,并迭代应用指定的下一个方法。 当指定的 hasNext 的 predicate 返回 false 时,迭代停止。

 IntStream.iterate(3, x -> x < 10, x -> x+ 3).forEach(System.out::print); // 打印369
  

ofNullable

可以预防 NullPointerExceptions 异常, 可以通过检查流来避免 null 值。如果指定元素为非 null,则获取一个元素并生成单个元素流,元素为 null 则返回一个空流。

 // java 9 之前,因为 Stream.of 方法不处理空对象,会有一个NullPointerException异常,Java 9 则返回一个空流。
Long count = Stream.ofNullable(null).count();
System.out.println(count); // 0
  

改进 try-with-resources

如果你已经有一个资源是 final 或等效于 final 变量,您可以在 try-with-resources 语句中使用该变量,而无需在 try-with-resources 语句中声明一个新变量。

 // Java 8 
Reader inputString = new StringReader(message);
BufferedReader br = new BufferedReader(inputString);
try (BufferedReader br1 = br) { // java 8 需要在try 语句块中声明资源 br1,然后才能使用它
  return br1.readLine();
}
// Java 9
Reader inputString = new StringReader(message);
BufferedReader br = new BufferedReader(inputString);
try (br) { // Java 9 不需要声明资源 br 就可以使用它
  return br.readLine();
}
  

改进的弃用注解 @Deprecated

注解 @Deprecated 可以标记 Java API 状态,可以表示被标记的 API 将会被移除,或者已经破坏

改进钻石操作符

匿名类可以使用钻石操作符

改进 Optional 类

Optional 添加了很多新的有用方法,Optional 可以直接转为 stream

stream

stream 方法的作用就是将 Optional 转为一个 Stream,如果该 Optional 中包含值,那么就返回包含这个值的 Stream,否则返回一个空的 Stream

 List<Optional<String>> list = Arrays.asList (
  Optional.empty(),
  Optional.of("A"),
  Optional.empty(),
  Optional.of("B"));
List<String> filteredListJava9 = list.stream()
  .flatMap(Optional::stream)
  .collect(Collectors.toList());
System.out.println(filteredListJava9); // 打印[A, B]
  

ifPresentOrElse

如果 Optional 不包含值,那么 ifPresentOrElse 便会调用 emptyAction

 Optional<Integer> optional = Optional.of(1);
optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() ->
        System.out.println("Not Present.")); // 输出:Value: 1
optional = Optional.empty();
optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() ->
        System.out.println("Not Present.")); // 输出:Not Present.
  

or

如果值存在,返回 Optional 指定的值,否则返回一个预设的值

 Optional<String> optional1 = Optional.of("Mahesh");
Supplier<Optional<String>> supplierString = () -> Optional.of("Not Present"); // 预设的值
optional1 = optional1.or(supplierString);
optional1.ifPresent( x -> System.out.println("Value: " + x)); // 输出:Value: Mahesh
optional1 = Optional.empty();
optional1 = optional1.or(supplierString);
optional1.ifPresent( x -> System.out.println("Value: " + x)); // 输出:Value: Not Present
  

多分辨率图像 API

定义多分辨率图像API,开发者可以很容易的操作和展示不同分辨率的图像了

改进的 CompletableFuture API

CompletableFuture 类的异步机制可以在 ProcessHandle.onExit 方法退出时执行操作

轻量级的 JSON API

内置了一个轻量级的JSON API

响应式流(Reactive Streams) API

Java 9中引入了新的响应式流 API 来支持 Java 9 中的响应式编程

文章来源:智云一二三科技

文章标题:Java 9(2017年9月22号)

文章地址:https://www.zhihuclub.com/176732.shtml

关于作者: 智云科技

热门文章

网站地图