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提供了创建集合的静态工厂方法,而且能够推断泛型,举个例子:
ListPerson>
list = Lists.newArrayList();
MapKeyType, Person>
map = Maps.newLinkedHashMap();
而原生态需要各种new
来定义。Java 9改善了这一现状,现在你可以:
// [1, 2, 3, 4]
ListInteger>
integers = List.of(1, 2, 3, 4);
// {
1,2,3}
SetInteger>
integerSet = Set.of(1, 2, 3);
// {
"hello":"world","hi":"java"}
MapString, String>
hello = Map.of("hello", "world", "hi", "java");
❝但是请注意:这些API创建的集合都是不可变的(Immutable),你不能对这些集合进行增删改。
Stream扩展
Stream API 是Java 8中引入的最重要的特性之一。在Java 9中Stream
进一步得到了加强。
ofNullable
StreamT>
ofNullable(T t)
返回包含单个元素的顺序Stream
,如果非空,否则返回空Stream
。这个比较简单就不举例了。
iterate
StreamT>
iterate(T seed, Predicate? super T>
hasNext, UnaryOperatorT>
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非常熟练的情况下才会锦上添花。
往期推荐
国庆第一天:先换个头像,然后分享下国庆学习计划吧!
Spring Boot 实现扫码登录,这种方式太香了!!
这是什么神仙公司?居然公布离职员工信息,还给差评?
“80后的人,真的该退出IT行业了”,某IT公司领导言论惹争议!
突发!LayUI宣布下线
技术交流群
最近有很多人问,有没有读者交流群,想知道怎么加入。加入方式很简单,有兴趣的同学,只需要点击下方卡片,回复“加群“,即可免费加入我们的高质量技术交流群!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Java 9 - 17 特性解读:Java 9
本文地址: https://pptw.com/jishu/1896.html