您的位置 首页 java

从Java 9 到 Java 17之Java 9

Java 17 是 Java 最重要的一个LTS版本之一,但是直接从Java 8 过渡到Java 17跨度太大了,势必有些困难。所以胖哥抽时间梳理了一下从Java 9到Java 17的一些常用API的变动。今天先来看看Java 9 都有什么东西。

Java 9

Java 9 最大的变化就是引入了一个JShell和模块化,日常并没有用太多,所以今天不花时间在这些功能上面。

新的创建集合的方法

用过谷歌 Guava 类库的知道, Guava 提供了创建集合的静态工厂方法,而且能够推断 泛型 ,举个例子:

  List<Person> list = Lists.newArrayList();
 Map<KeyType, Person> map = Maps.newLinkedHashMap();  

而原生态需要各种 new 来定义。Java 9中改善了这一现状,现在你可以:

  // [1, 2, 3, 4]
 List<Integer> integers = List.of(1, 2, 3, 4);
 // {1,2,3}
 Set<Integer> integerSet = Set.of(1, 2, 3);
 // {"hello":"world","hi":"java"}
 Map<String, String> hello = Map.of("hello", "world", "hi", "java");  

Stream扩展

Stream API 是Java 8中引入的最重要的特性之一。在Java 9中 Stream 进一步得到了加强。

ofNullable

Stream<T> ofNullable(T t) 返回包含单个元素的顺序 Stream ,如果非空,否则返回空 Stream 。这个比较简单就不举例了。

iterate

  Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)  

这个是用来生成有限流的新迭代实现。

  • seed 初始种子值
  • hasNext 用来判断何时结束流,这个与 seed 有关。如何该函数不迭代保留 seed 计算,返回的流可能为空。
  • next 函数用来计算下一个元素值。

举个例子:

  Stream.iterate(0, i -> i < 5, i -> i + 1)
   . forEach (System.out::println);  

等同于传统的:

  for (int i = 0; i < 5; ++i) {
     System.out.println(i);
 }
   

takeWhile

Stream.takeWhile(Predicate) Stream 中元素会被断言 Predicate ,一旦元素断言为 false 就中断操作,忽略掉没有断言的元素(及时未断言中的元素有满足条件的),仅仅把之前满足元素返回。

  Stream.of(1, 2, 3, 4, 2, 5)
         .takeWhile(x -> x < 4)
         .forEach(System.out::println);  

上面的例子中只会输出 1 2 3

dropWhile

这个API和 takeWhile 机制类似,也用来筛选 Stream 中的元素。不过符合断言的元素会被从 Stream 中移除。一旦元素断言为 false ,就会把断言为 false 的元素以及后面的元素统统返回。

  Stream.of(1, 2, 3, 4, 2, 5)
         .dropWhile(x -> x < 4)
         .forEach(System.out::println);  

上面的例子会输出 4 2 5

filter 操作可不一样啊,切记!

Optional扩展

Optional 增加了三个有用的API。

  • stream() Optional 现在可以转 Stream
  • ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) 如果有值了怎么消费,没有值了怎么消费。
  • or(Supplier<? extends Optional<? extends T>> supplier) 如果有值就返回有值的 Optional ,否则就提供能获取一个有值的 Optional 的渠道( Supplier )。

try-with-resources 优化

Java 7 中引入了 try-with-resources 功能,保证了每个声明了的资源在语句结束的时候都会被关闭。任何实现了 java.lang.AutoCloseable 接口的对象,和实现了 java.io.Closeable 接口的对象,都可以当做资源使用。

Java 7时需要这样写:

      try (BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
              BufferedInputStream bufferedInputStream1 = new BufferedInputStream(System.in)) {
             // do something
         } catch (IOException e) {
             e.printStackTrace();
         }  

而到了Java 9简化为:

 BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
BufferedInputStream bufferedInputStream1 = new BufferedInputStream(System.in);

try (bufferedInputStream;
     bufferedInputStream1) {
    // do something
} catch (IOException e) {
    e.printStackTrace();
}  

接口私有方法

继Java 8 引入了接口静态方法和接口默认方法后,又引入了接口私有方法:

 public interface Catable {
    /**
     * 接口私有方法
     */    private void doSomething() {

    }
}  

引入 HttpClient

定义一个新的 HTTP 客户端 API 来实现 HTTP/2 和 WebSocket,并且可以替换旧的 HttpURLConnection API。Java以前原生的确实难用,所以诞生了 Apache HttpClientComponents 、OkHttp等好用的客户端。新的也不怎么好用,不过也算从零到一了。

 HttpRequest httpRequest = HttpRequest.newBuilder(newURI)
        .header("Content-Type","*/*")
        .GET()
        .build();
HttpClient httpClient = HttpClient.newBuilder()
        .connectTimeout(Duration.of(10, ChronoUnit.SECONDS))
        .version(HttpClient.Version.HTTP_2)
        .build();  

Flow

Spring WebFlux 响应式Web框架已经4年了,响应流规范(reactive streams)在Java 9 中也初步引入到了JDK中。这个东西目前还有些先进,胖哥还没找到具体应用场景,先挖个坑。

总结

其实Java 9 还有一些底层的优化,不过对于普通开发者来说了解这些就够用了。上面几个特性,比较常用的就是静态不变集合、 try-with-resources 优化。 其它的特性需要你对Java 8非常熟练的情况下才会锦上添花。

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

文章标题:从Java 9 到 Java 17之Java 9

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

关于作者: 智云科技

热门文章

网站地图