Java9的一些学习碎片

of() 方法
可以创建的类有 Set、 List、Map

  List list = List.of();
  Set s = Set.of();
  Map m = Map.of();

也可以创建有值的集合

  List list = List.of("value1","value2","value3");
  Set s = Set.of("value1","value2","value3");
  Map m = Map.of((1, "value1", 2, "value2", 3, "value3");

接口中引入私有方法

public interface TestInterface{
  private static void displayCardDetails(){
    // Method implementation goes here.
  }
}

对Java7 提出的Try-With-Resources 用法进行了优化
下面是Java7的实现方式

void testARM_Before_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (BufferedReader reader2 = reader1) {
   System.out.println(reader2.readLine());
 }
}

这是Java9的实现方式:

void testARM_Before_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (reader1) {
   System.out.println(reader1.readLine());
 }
}

文档的是如果我们有一个已经在Try-With-Resource语句外面声明为final或有效final的资源,那么我们就不需要声明一个局部变量。我们可以在Try-With-Resource语句中使用以前创建的变量,没有任何问题。

进行延时和超时操作,实用方法和更好的子类化的API

  Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);

引入了一个新的 Reactive Streams API。
Java SE 9 Reactive Streams API 是一个发布订阅型框架,使我们能够非常简单地使用 Java 语言就能实现异步的、可拓展的和并行的应用。

**引入一个新的 Мulti-Resolution Image API。这个 API 中比较重要的接口是 MultiResolutionImage,在 java.awt.image 包下可获取到。用于封装不同高度和宽度图片(不同解决方案)到一个集合中,并允许我们按需查询使用。

引入新的 HTTP 2 Client API。它将同时支持 HTTP/1.1 和 HTTP/2 协议,也同时支持同步(Blocking Mode)和异步模式,支持 WebSocket API 使用中的异步模式。**

Java8中的Stream:

jshell> import java.util.stream.*

jshell> Stream stream = Stream.of(1,2,3,4,5,6,7,8,9,10)
stream ==> java.util.stream.ReferencePipeline$Head@64bfbc86

jshell> stream.forEach(x -> System.out.println(x));
1
2
3
4
5
6
7
8
9
10

Java 9对Stream API进行了改进,向Java.util添加了四个有用的新方法:
dropWhile
takeWhile
iterate
ofNullable
由于流是一个接口,所以前两个新方法是默认方法,最后两个是静态方法。其中两个是非常重要的:dropWhile和takeWhile 方法。

在Stream API中,while()方法返回与谓词条件相匹配的最长前缀元素。
它以Predicate作为参数。Predicate是布尔表达式,它返回true或false。对于有序和无序的流,它的行为是不同的。让我们用下面一些简单的例子来探索它们。

default Stream<T> takeWhile(Predicate<? super T> predicate)

如果流是一个有序的,那么当takeWhile方法返回与该Predicate匹配的最长前缀时。结果流只包含与Predicate条件相匹配的前缀元素。


jshell> Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9,10)
stream ==> java.util.stream.ReferencePipeline$Head@55d56113

jshell> stream.takeWhile(x -> x < 4).forEach(a -> System.out.println(a))
1
2
3

由于这条流是有序的,所以takeWhile方法返回与Predicate相匹配的前三个元素。这里的Predicate是“元素必须小于4”。

无序的

jshell> Stream<Integer> stream = Stream.of(1,2,4,5,3,6,7,8,9,10)
stream ==> java.util.stream.ReferencePipeline$Head@55d56113

jshell> stream.takeWhile(x -> x < 4).forEach(a -> System.out.println(a))
1
2

由于这条流是无序的,所以takeWhile方法返回前两个与Predicate相匹配的元素。

在Stream API中,dropWhile()方法会删除与Predicate相匹配的最长前缀元素,并返回其余的元素。


jshell> Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9,10)
stream ==> java.util.stream.ReferencePipeline$Head@55d56113

jshell> stream.dropWhile(x -> x < 4).forEach(a -> System.out.println(a))
4
5
6
7
8
9
10

由于这条流是有序的,dropWhile()方法首先删除与Predicate相匹配的三个要素,并将剩余的元素返回到结果流中。这里我们的谓词是"元素必须小于4

Diamond 操作器和匿名内部类的改进

public List getEmployee(String empid){
    // Code to get Employee details from Data Store
    return new List(emp){ };
}

这里我们可以只使用“List”,而不指定类型参数。

删除了一些工具和组件
移除 rt.jar 和 tools.jar
移除JavaDB
删除了JVM TI 工具代理
删除jhat(Java Heap Analysis Tool)工具
删除 java-rmi.exe和java-rmi.cgi发射器
移除了Java VisualVM
从JMX RMIConnector中移除对IIOP传输的支持
删除native2ascii工具

更详细的内容可以去这里看下:https://www.journaldev.com/java

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。