【小家java】java9新特性(简述十大新特性) 褒贬不一(下)

简介: 【小家java】java9新特性(简述十大新特性) 褒贬不一(下)

7、集合工厂方法:快速创建只读集合


为了保证数据的安全性,有时候我们需要创建一个只读的List。在JDK8的时候,我们只能这么做:


Collections.unmodifiableList(list)
Collections.unmodifiableSet(set)
Collections.unmodifiableMap(map)


Tips:Arrays.asList(1,2,3)创建的List也是只读的,不能添加删除,但是一般我们并不会把他当作只读来用。


可以说是比较繁琐的一件事。Java 9 因此引入了方便的方法,这使得类似的事情更容易表达。调用集合中静态方法 of(),可以将不同数量的参数传输到此工厂方法。此功能可用于 Set 和 List,也可用于 Map 的类似形式。此时得到

的集合,是不可变的:


List<String> list = List.of("a", "b", "c");
        Set<String> set = Set.of("a", "b", "c");
        //Map的两种初始化方式,个人喜欢第二种,语意更加清晰些,也不容易错
        Map<String, Integer> map1 = Map.of("Tom", 12, "Jerry", 21,
                "Lilei", 33, "HanMeimei", 18);
        Map<String, Integer> map2 = Map.ofEntries(
                Map.entry("Tom", 89),
                Map.entry("Jim", 78),
                Map.entry("Tim", 98)
        );


处于好奇心,可以让大家再对比一下类型,看看怎么实现的:


public static void main(String[] args) {
        List<String> list = List.of("a", "b", "c");
        List<String> listOld = Collections.unmodifiableList(Arrays.asList("a", "b", "c"));
        System.out.println(list.getClass().getName()); //java.util.ImmutableCollections$ListN
        System.out.println(listOld.getClass().getName()); //java.util.Collections$UnmodifiableRandomAccessList
    }


8、增强的 Stream API


在 Java 9 中,Stream API 变得更好,Stream 接口中添加了 4 个新的方法:dropWhile, takeWhile, ofNullable,还有个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。


除了对 Stream 本身的扩展,Optional 和 Stream 之间的结合也

得到了改进。现在可以通过 Optional 的新方法 stream() 将一个

Optional 对象转换为一个(可能是空的) Stream 对象


   takeWhile():返回从开头开始的尽量多的元素


   dropWhile() :行为与 takeWhile 相反,返回剩余的元素


   ofNullable():Stream 不能全为 null,否则会报空指针异常。而 Java 9 中的ofNullable健壮性就比of强很多。可以包含一个非空元素,也可以创建一个空 Stream


//报 NullPointerException   因为Of方法不允许全为null的
//Stream<Object> stream1 = Stream.of(null);
//System.out.println(stream1.count());
//ofNullable():允许值为 null
Stream<Object> stream1 = Stream.ofNullable(null);
System.out.println(stream1.count());//0


   iterator()重载方法。如下,相当于不仅仅是limit,而是可以写逻辑来判断终止与否了


image.png


9、全新的 HTTP 客户端 API


HTTP,用于传输网页的协议,早在 1997 年就被采用在目前的 1.1

版本中。直到 2015 年,HTTP2 才成为标准。


Java 9 中有新的方式来处理 HTTP 调用。它提供了一个新的 HTTP客户端( HttpClient ), 它 将 替代仅适用于 blocking 模式的HttpURLConnection (HttpURLConnection是在HTTP 1.0的时代创建的,并使用了协议无关的方法),并提供对 WebSocket 和 HTTP/2 的支持。


此外,HTTP 客户端还提供 API 来处理 HTTP/2 的特性,比如流和

服务器推送等功能。全新的 HTTP 客户端 API 可以从 jdk.incubator.httpclient 模块中获取。因为在默认情况下,这个模块是不能根据 classpath 获取的,需要使用 add modules 命令选项配置这个模块,将这个模块添加到 classpath中。

栗子:


HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create("http://www.baidu.com")).GET().build();
HttpResponse<String> response = client.send(req, 
HttpResponse.BodyHandler.asString());
System.out.println(response.statusCode());
System.out.println(response.version().name());
System.out.println(response.body());


10、其它特性


Deprecated 废弃了相关 API


Java 9 废弃或者移除了几个不常用的功能。其中最主要的是

Applet API,现在是标记为废弃的。随着对安全要求的提高,主流浏

览器已经取消对 Java 浏览器插件的支持


智能 Java 编译工具


智能 java 编译工具( sjavac )的第一个阶段始于 JEP139 这个项目,用于在多核处理器情况下提升 JDK 的编译速度


JDK 9 还更新了 javac 编译器以便能够将 java 9 代码编译运行在低版本 Java 中


统一的 JVM 日志系统

javadoc 的 HTML 5 支持


Nashorn 项目在 JDK 9 中得到改进,它为 Java 提供轻量级的Javascript 运行时。

JDK 9 包含一个用来解析 Nashorn 的 ECMAScript 语法树的API。这个 API 使得 IDE 和服务端框架不需要依赖 Nashorn 项目的内部实现类,就能够分析 ECMAScript 代码。


Javascript 引擎升级:Nashorn(该引擎在8中首次引入,非常好用)

java 的动态编译器

**JIT(Just-in-time)**编译器可以在运行时将热点编译成本地代码,

速度很快。但是 Java 项目现在变得很大很复杂,因此 JIT 编译器需

要花费较长时间才能热身完,而且有些 Java 方法还没法编译,性能

方面也会下降。AoT 编译就是为了解决这些问题而生的


JIT是个很大的研究课题,阿里有专门的团队搞这一块


最后:


Java9有一个重大的变化,就是垃回收器默认采用了G1。


Java 9 移除了在 Java 8 中 被废弃的垃圾回收器配置组合,同时把G1设为默认的垃圾回收器实现。替代了之前默认使用的Parallel GC,对于这个改变,evens的评论是酱紫的:这项变更是很重要的,因为相对于Parallel来说,G1会在应用线程上做更多的事情,而Parallel几乎没有在应用线程上做任何事情,它基本上完全依赖GC线程完成所有的内存管理。这意味着切换到G1将会为应用线程带来额外的工作,从而直接影响到应用的性能


CMS收集器与G1收集器的区别,参考:CMS收集器与G1收集器


相关文章
|
2月前
|
安全 前端开发 Java
随着企业应用复杂度提升,Java Spring框架以其强大与灵活特性简化开发流程,成为构建高效、可维护应用的理想选择
随着企业应用复杂度提升,Java Spring框架以其强大与灵活特性简化开发流程,成为构建高效、可维护应用的理想选择。依赖注入使对象管理交由Spring容器处理,实现低耦合高内聚;AOP则分离横切关注点如事务管理,增强代码模块化。Spring还提供MVC、Data、Security等模块满足多样需求,并通过Spring Boot简化配置与部署,加速微服务架构构建。掌握这些核心概念与工具,开发者能更从容应对挑战,打造卓越应用。
35 1
|
2月前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
72 0
|
7天前
|
安全 Java API
java安全特性
java安全特性
20 8
|
7天前
|
JavaScript 前端开发 Java
Java 8 新特性详解及应用示例
Java 8 新特性详解及应用示例
|
9天前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的探索
【9月更文挑战第24天】本文将深入浅出地介绍Java 8中的重要新特性——Lambda表达式和Stream API,通过实例解析其语法、用法及背后的设计哲学。我们将一探究竟,看看这些新特性如何让Java代码变得更加简洁、易读且富有表现力,同时提升程序的性能和开发效率。
|
18天前
|
机器学习/深度学习 人工智能 安全
python和Java的区别以及特性
Python:适合快速开发、易于维护、学习成本低、灵活高效。如果你需要快速上手,写脚本、数据处理、做点机器学习,Python就是你的首选。 Java:适合大型项目、企业级应用,性能要求较高的场景。它类型安全、跨平台能力强,而且有丰富的生态,适合更复杂和规模化的开发。
18 3
|
24天前
|
安全 Java API
Java 18 概述:新特性一览
Java 18 作为 Java 平台的最新版本,引入了多项令人振奋的新特性和改进,包括模式匹配、记录类型、流库改进、外部函数与内存 API 以及并发处理增强。这些新功能不仅提升了开发者的生产力,还显著增强了 Java 的性能和安全性。本文将详细介绍 Java 18 的主要新特性,并通过代码示例帮助读者更好地理解和应用这些功能。
|
2月前
|
Java API
Java 8新特性:Lambda表达式与Stream API的深度解析
【7月更文挑战第61天】本文将深入探讨Java 8中的两个重要特性:Lambda表达式和Stream API。我们将首先介绍Lambda表达式的基本概念和语法,然后详细解析Stream API的使用和优势。最后,我们将通过实例代码演示如何结合使用Lambda表达式和Stream API,以提高Java编程的效率和可读性。
|
2月前
|
Java 开发者
Java 8新特性之Lambda表达式与函数式接口
【7月更文挑战第59天】本文将介绍Java 8中的一个重要新特性——Lambda表达式,以及与之密切相关的函数式接口。通过对比传统的匿名内部类,我们将探讨Lambda表达式的语法、使用方法和优势。同时,我们还将了解函数式接口的定义和用途,以及如何将Lambda表达式应用于函数式编程。
|
2月前
|
分布式计算 Java API
Java 8带来了流处理与函数式编程等新特性,极大提升了开发效率
Java 8带来了流处理与函数式编程等新特性,极大提升了开发效率。流处理采用声明式编程模型,通过filter、map等操作简化数据集处理,提高代码可读性。Lambda表达式支持轻量级函数定义,配合Predicate、Function等接口,使函数式编程无缝融入Java。此外,Optional类及新日期时间API等增强功能,让开发者能更优雅地处理潜在错误,编写出更健壮的应用程序。
26 1
下一篇
无影云桌面