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");

但是请注意:这些API创建的集合都是不可变的(Immutable),你不能对这些集合进行增删改。

Stream扩展

Stream APIStream进一步得到了加强。

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);

上面的例子中只会输出123

dropWhile

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

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

上面的例子会输出425

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,并且可以替换旧的HttpURLConnectionAPI。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 还有一些底层的优化,不过对于普通开发者来说了解这些就够用了。上面几个特性,比较常用的就是静态不变集合、try-with-resources优化。其它的特性需要你对Java 8非常熟练的情况下才会锦上添花。

往期推荐

国庆第一天:先换个头像,然后分享下国庆学习计划吧!

Spring Boot 实现扫码登录,这种方式太香了!!

这是什么神仙公司?居然公布离职员工信息,还给差评?

“80后的人,真的该退出IT行业了”,某IT公司领导言论惹争议!

突发!LayUI宣布下线

技术交流群

最近有很多人问,有没有读者交流群,想知道怎么加入。加入方式很简单,有兴趣的同学,只需要点击下方卡片,回复“加群“,即可免费加入我们的高质量技术交流群!

Java 9 - 17 特性解读:Java 9相关推荐

  1. Java 9 - 17 特性解读:​Java 13

    Java 13在2019年9月发布,这个版本引入的正式可用特性几乎没有,是我认为最无聊的版本之一.所以我们跳过Java 13直接来看Java 14吧. Switch表达式 我觉得switch表达式在日 ...

  2. Java 9 - 17 特性解读:Java 11

    Java 11是自Java 8以来的又一个LTS版本,是目前全球使用最多的LTS版本之一.今天我们接着在Java 9 到 Java 17系列文章中来认识针对普通开发者的Java 11. 字符串API增 ...

  3. Java 9 - 17 特性解读:Java 10

    在上一篇我们对Java 9的特性进行了一些回顾,今天接着来看看Java 10带来了什么特性.之所以需要把Java 8 到Java 17的特性归纳一遍,因为Java社区对Java 17的重视程度前所未有 ...

  4. 【Java 8 新特性】Java Stream 通过skip()方法跳过前N个子元素

    [Java 8 新特性]Java Stream 通过skip方法跳过前N个子元素 1.skip() 示例 2.skip() vs limit() 参考文献 本页将介绍 Stream.skip方法示例. ...

  5. 全网最全的JAVA所有版本特性【JAVA 1.0 - JAVA 20】

    闲来想了解下各版本之间的特性,搜索没有最新的特性说明,故想写一份.废话不多说. PS:绝对全网最全最齐,若不是,请私聊我补充,哈哈哈哈! JDK Version 1.0 1996-01-23 Oak( ...

  6. IntelliJ IDEA 使用 Java 11新特性以及Java 8 以来的Java 11新特性介绍

    文章目录 Java 11 安装 IDEA 设置 特性1:lambda表达式中允许使用var 特性2: String新增REPEAT 方法,方便拷贝字符串 特性3: 文件读写更方便:readString ...

  7. [转]【JAVA各版本特性】JAVA 1.0

    闲来想了解下各版本之间的特性,搜索没有最新的特性说明,故想写一份.废话不多说. JDK Version 1.0 1996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用 ...

  8. 【Java 8 新特性】Java Clock 详解

    Java Clock 详解 systemDefaultZone millis instant offset system systemUTC tick tickMillis tickSeconds t ...

  9. 【Java 8 新特性】Java Stream.of()用法示例

    本页将介绍Java Stream.of方法示例.Stream.of用于为给定元素创建顺序流.我们可以传递单个元素或多个元素. 查看javadoc中Stream.of方法声明. static <T ...

最新文章

  1. 【项目实战】SQL :部门花名册PBI展示
  2. 【转载】揭开硬件中断请求IRQ所有秘密(图解)
  3. oracle 静态监听 端口,侦听动态注册静态注册local_listener参数端口PORT
  4. 【转】Java抽象类与接口的区别
  5. python 数据变化——n次多项式
  6. UI设计字体素材|设计中字母间距指南
  7. 手机屏坏了怎么把里面存东西取出来_三年来,这十八个有关MT4的问题被问了三千遍...
  8. Servlet 生命周期、工作原理(转)
  9. DHCP Snooping,Dynamic ARP Inspection实现
  10. web xml配置oracle数据源_SpringBoot2 整合JTA组件,多数据源事务管理
  11. 物联网中的密码安全风险
  12. java中的创建和调用_如何在Mirth Connect中创建和调用自定义Java代码
  13. 外贸企业出口退税流程/经验分享
  14. 自主研发国产高端企业云服务器,浪潮商用机器如何聚沙成塔?
  15. 面试官问了四个问题,总结了4个经验
  16. CWnd与HWND的区别与联系(相互转换)完全解析
  17. 西安交大软件学院推免远程面试夏令营分享
  18. openjudge白细胞计数
  19. Windows 11操作系统 ndis.sys 驱动无限蓝屏问题修复
  20. 人类高质量代码解约瑟夫环问题

热门文章

  1. windows 2008 server R2 按服务器角色的版本对比
  2. 万网稳居国内域名主机网站榜首 西部数码第二
  3. 多线程同步之 WaitableTimer (等待定时器对象)[续三]
  4. ctfmn.exe——藏在字体目录FONTS下的***
  5. ajax实现文件上传
  6. java maven项目构建ssh工程 父工程与子模块的拆分与聚合
  7. linux shell 脚本嵌套调用 获取脚本自身文件名
  8. docker 在容器外执行某个容器内的某个命令
  9. centos7 安装 redis
  10. linux 内核 目录项高速缓存 dentry cache 简介