Java 9 - 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");
❝
但是请注意:这些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);
上面的例子中只会输出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 还有一些底层的优化,不过对于普通开发者来说了解这些就够用了。上面几个特性,比较常用的就是静态不变集合、try-with-resources优化。其它的特性需要你对Java 8非常熟练的情况下才会锦上添花。
往期推荐
国庆第一天:先换个头像,然后分享下国庆学习计划吧!
Spring Boot 实现扫码登录,这种方式太香了!!
这是什么神仙公司?居然公布离职员工信息,还给差评?
“80后的人,真的该退出IT行业了”,某IT公司领导言论惹争议!
突发!LayUI宣布下线
技术交流群
最近有很多人问,有没有读者交流群,想知道怎么加入。加入方式很简单,有兴趣的同学,只需要点击下方卡片,回复“加群“,即可免费加入我们的高质量技术交流群!
Java 9 - 17 特性解读:Java 9相关推荐
- Java 9 - 17 特性解读:Java 13
Java 13在2019年9月发布,这个版本引入的正式可用特性几乎没有,是我认为最无聊的版本之一.所以我们跳过Java 13直接来看Java 14吧. Switch表达式 我觉得switch表达式在日 ...
- Java 9 - 17 特性解读:Java 11
Java 11是自Java 8以来的又一个LTS版本,是目前全球使用最多的LTS版本之一.今天我们接着在Java 9 到 Java 17系列文章中来认识针对普通开发者的Java 11. 字符串API增 ...
- Java 9 - 17 特性解读:Java 10
在上一篇我们对Java 9的特性进行了一些回顾,今天接着来看看Java 10带来了什么特性.之所以需要把Java 8 到Java 17的特性归纳一遍,因为Java社区对Java 17的重视程度前所未有 ...
- 【Java 8 新特性】Java Stream 通过skip()方法跳过前N个子元素
[Java 8 新特性]Java Stream 通过skip方法跳过前N个子元素 1.skip() 示例 2.skip() vs limit() 参考文献 本页将介绍 Stream.skip方法示例. ...
- 全网最全的JAVA所有版本特性【JAVA 1.0 - JAVA 20】
闲来想了解下各版本之间的特性,搜索没有最新的特性说明,故想写一份.废话不多说. PS:绝对全网最全最齐,若不是,请私聊我补充,哈哈哈哈! JDK Version 1.0 1996-01-23 Oak( ...
- IntelliJ IDEA 使用 Java 11新特性以及Java 8 以来的Java 11新特性介绍
文章目录 Java 11 安装 IDEA 设置 特性1:lambda表达式中允许使用var 特性2: String新增REPEAT 方法,方便拷贝字符串 特性3: 文件读写更方便:readString ...
- [转]【JAVA各版本特性】JAVA 1.0
闲来想了解下各版本之间的特性,搜索没有最新的特性说明,故想写一份.废话不多说. JDK Version 1.0 1996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用 ...
- 【Java 8 新特性】Java Clock 详解
Java Clock 详解 systemDefaultZone millis instant offset system systemUTC tick tickMillis tickSeconds t ...
- 【Java 8 新特性】Java Stream.of()用法示例
本页将介绍Java Stream.of方法示例.Stream.of用于为给定元素创建顺序流.我们可以传递单个元素或多个元素. 查看javadoc中Stream.of方法声明. static <T ...
最新文章
- 【项目实战】SQL :部门花名册PBI展示
- 【转载】揭开硬件中断请求IRQ所有秘密(图解)
- oracle 静态监听 端口,侦听动态注册静态注册local_listener参数端口PORT
- 【转】Java抽象类与接口的区别
- python 数据变化——n次多项式
- UI设计字体素材|设计中字母间距指南
- 手机屏坏了怎么把里面存东西取出来_三年来,这十八个有关MT4的问题被问了三千遍...
- Servlet 生命周期、工作原理(转)
- DHCP Snooping,Dynamic ARP Inspection实现
- web xml配置oracle数据源_SpringBoot2 整合JTA组件,多数据源事务管理
- 物联网中的密码安全风险
- java中的创建和调用_如何在Mirth Connect中创建和调用自定义Java代码
- 外贸企业出口退税流程/经验分享
- 自主研发国产高端企业云服务器,浪潮商用机器如何聚沙成塔?
- 面试官问了四个问题,总结了4个经验
- CWnd与HWND的区别与联系(相互转换)完全解析
- 西安交大软件学院推免远程面试夏令营分享
- openjudge白细胞计数
- Windows 11操作系统 ndis.sys 驱动无限蓝屏问题修复
- 人类高质量代码解约瑟夫环问题
热门文章
- windows 2008 server R2 按服务器角色的版本对比
- 万网稳居国内域名主机网站榜首 西部数码第二
- 多线程同步之 WaitableTimer (等待定时器对象)[续三]
- ctfmn.exe——藏在字体目录FONTS下的***
- ajax实现文件上传
- java maven项目构建ssh工程 父工程与子模块的拆分与聚合
- linux shell 脚本嵌套调用 获取脚本自身文件名
- docker 在容器外执行某个容器内的某个命令
- centos7 安装 redis
- linux 内核 目录项高速缓存 dentry cache 简介