当前位置: 首页 > news >正文

百日筑基第四十五天-从JAVA8走到JAVA9

JAVA9新特性

Java 9发布于 2017 年 9 月 21 日 。

快速创建不可变集合

增加了List.of()Set.of()Map.of()Map.ofEntries()等工厂方法来创建不可变集合(有点参考 Guava 的味道):

List.of("Java", "C++");
Set.of("Java", "C++");
Map.of("Java", 1, "C++", 2);

使用 of() 创建的集合为不可变集合,不能进行添加、删除、替换、 排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。

String 存储结构优化

Java 8 及之前的版本,String 一直是用 char[] 存储。在 Java 9 之后,String 的实现改用 byte[] 数组存储字符串,节省了空间。

public final class String implements java.io.Serializable,Comparable<String>, CharSequence {// @Stable 注解表示变量最多被修改一次,称为“稳定的”。@Stableprivate final byte[] value;
}

接口私有方法

Java 9 允许在接口中使用私有方法。这样的话,接口的使用就更加灵活了,有点像是一个简化版的抽象类。

public interface MyInterface {private void methodPrivate(){}
}

try-with-resources 增强

在 Java 9 之前,我们只能在 try-with-resources 块中声明变量:

try (Scanner scanner = new Scanner(new File("testRead.txt"));PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {// omitted
}

在 Java 9 之后,在 try-with-resources 语句中可以使用 effectively-final 变量。

final Scanner scanner = new Scanner(new File("testRead.txt"));
PrintWriter writer = new PrintWriter(new File("testWrite.txt"))
try (scanner;writer) {// omitted
}

什么是 effectively-final 变量? 简单来说就是没有被 final 修饰但是值在初始化后从未更改的变量。

正如上面的代码所演示的那样,即使 writer 变量没有被显示声明为 final,但它在第一次被赋值后就不会改变了,因此,它就是 effectively-final 变量。

Stream & Optional 增强

Stream 中增加了新的方法 ofNullable()dropWhile()takeWhile() 以及 iterate() 方法的重载方法。

Java 9 中的 ofNullable() 方法允许我们创建一个单元素的 Stream,可以包含一个非空元素,也可以创建一个空 Stream。 而在 Java 8 中则不可以创建空的 Stream

Stream<String> stringStream = Stream.ofNullable("Java");
System.out.println(stringStream.count());// 1
Stream<String> nullStream = Stream.ofNullable(null);
System.out.println(nullStream.count());//0

takeWhile() 方法可以从 Stream 中依次获取满足条件的元素,直到不满足条件为止结束获取。

List<Integer> integerList = List.of(11, 33, 66, 8, 9, 13);
integerList.stream().takeWhile(x -> x < 50).forEach(System.out::println);// 11 33

dropWhile() 方法的效果和 takeWhile() 相反。

List<Integer> integerList2 = List.of(11, 33, 66, 8, 9, 13);
integerList2.stream().dropWhile(x -> x < 50).forEach(System.out::println);// 66 8 9 13

iterate() 方法的新重载方法提供了一个 Predicate 参数 (判断条件)来决定什么时候结束迭代

public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f) {
}
// 新增加的重载方法
public static<T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next) {}

两者的使用对比如下,新的 iterate() 重载方法更加灵活一些。

// 使用原始 iterate() 方法输出数字 1~10
Stream.iterate(1, i -> i + 1).limit(10).forEach(System.out::println);
// 使用新的 iterate() 重载方法输出数字 1~10
Stream.iterate(1, i -> i <= 10, i -> i + 1).forEach(System.out::println);

Optional 类中新增了 ifPresentOrElse()or()stream() 等方法

ifPresentOrElse() 方法接受两个参数 ConsumerRunnable ,如果 Optional 不为空调用 Consumer 参数,为空则调用 Runnable 参数。

public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)Optional<Object> objectOptional = Optional.empty();
objectOptional.ifPresentOrElse(System.out::println, () -> System.out.println("Empty!!!"));// Empty!!!

or() 方法接受一个 Supplier 参数 ,如果 Optional 为空则返回 Supplier 参数指定的 Optional 值。

public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)Optional<Object> objectOptional = Optional.empty();
objectOptional.or(() -> Optional.of("java")).ifPresent(System.out::println);//java

进程 API

Java 9 增加了 java.lang.ProcessHandle 接口来实现对原生进程进行管理,尤其适合于管理长时间运行的进程。

// 获取当前正在运行的 JVM 的进程
ProcessHandle currentProcess = ProcessHandle.current();
// 输出进程的 id
System.out.println(currentProcess.pid());
// 输出进程的信息
System.out.println(currentProcess.info());

响应式流 ( Reactive Streams )

在 Java 9 中的 java.util.concurrent.Flow 类中新增了反应式流规范的核心接口 。

Flow 中包含了 Flow.PublisherFlow.SubscriberFlow.SubscriptionFlow.Processor 等 4 个核心接口。Java 9 还提供了SubmissionPublisher 作为Flow.Publisher 的一个实现。

变量句柄

变量句柄是一个变量或一组变量的引用,包括静态域,非静态域,数组元素和堆外数据结构中的组成部分等。

变量句柄的含义类似于已有的方法句柄 MethodHandle ,由 Java 类 java.lang.invoke.VarHandle 来表示,可以使用类 java.lang.invoke.MethodHandles.Lookup 中的静态工厂方法来创建 VarHandle 对象。

VarHandle 的出现替代了 java.util.concurrent.atomicsun.misc.Unsafe 的部分操作。并且提供了一系列标准的内存屏障操作,用于更加细粒度的控制内存排序。在安全性、可用性、性能上都要优于现有的 API。

相关文章:

百日筑基第四十五天-从JAVA8走到JAVA9

JAVA9新特性 Java 9发布于 2017 年 9 月 21 日 。 快速创建不可变集合 增加了List.of()、Set.of()、Map.of() 和 Map.ofEntries()等工厂方法来创建不可变集合&#xff08;有点参考 Guava 的味道&#xff09;&#xff1a; List.of("Java", "C"); Set.of…...

力扣第五十七题——插入区间

内容介绍 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表 intervals&#xff0c;其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束&#xff0c;并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示另一个区…...

跟《经济学人》学英文:2024年08月03日这期 India’s economic policy will not make it rich

India’s economic policy will not make it rich A new World Bank report takes aim at emerging-market growth plans 原文&#xff1a; The developing world has fallen back in love with economic planning. As protectionism sweeps the West, poor countries are n…...

js 深拷贝、浅拷贝深度解析

赋值操作&#xff1a; let obj{a:1,b:[1,2,3],c:{m:2}}let newObjobjnewObj.a2newObj.b.push(4)newObj.c.m3console.log(obj,newObj); 将一个对象赋值给一个变量&#xff0c;其实就是将这个对象在栈内存中的引用地址复制给了这个变量&#xff0c;这两个对象指向堆内存中的同一个…...

CSS文本两端对齐

背景 如果我们要写了列表或表单类的样式&#xff0c;名称长短不一&#xff0c;但是想要两端对齐&#xff0c;如下面这样的&#xff1a; 你是怎么写的&#xff1f; 是这样的吗&#xff0c;在HTML里调整加空格&#xff1a; <ul><li>用户名</li><li>账 …...

C#中的foreach和自定义比较

在C#中foreach不能修改集合里面的值 在C#中&#xff0c;使用 foreach 循环遍历集合时&#xff0c;通常不建议修改集合中的元素&#xff0c;因为 foreach 循环是针对集合的枚举器进行操作的&#xff0c;而枚举器通常不支持修改集合中的元素。如果尝试在 foreach 循环中修改集合…...

有序转化数组(LeetCode)

题目 给你一个已经 排好序 的整数数组 和整数 、 、 。对于数组中的每一个元素 &#xff0c;计算函数值 &#xff0c;请 按升序返回数组 。 解题 在时间复杂度为解决问题 def sortTransformedArray(nums, a, b, c):def f(x):return a * x * x b * x cn len(nums)result…...

大数据信用报告查询有什么作用?怎么选择查询平台?

随着互联网的快速发展&#xff0c;人们的金融行为越来越多地依赖于网络平台。然而&#xff0c;网络上的金融交易存在着一定的风险&#xff0c;为了有效地防范这些风险&#xff0c;金融机构采用了大数据技术进行风险控制&#xff0c;下面&#xff0c;小易大数据平台将详细介绍大…...

import cv2ModuleNotFoundError: No module named ‘cv2‘

import cv2 ModuleNotFoundError: No module named cv2 (base) PS D:\CAMERA-D861T\LabelImg> pip3 install cv2 ERROR: Could not find a version that satisfies the requirement cv2 (from versions: none) ERROR: No matching distribution found for cv2 办法1 试了无…...

[Modbus] Modbus协议开发-基本概念(一)

历史 ModBus官网是Modicon&#xff08;Modicon早年已被施耐德收购&#xff09;公司为其PLC通讯而开发的一种通讯协议。 概述 通过Modbus协议&#xff0c;控制器之间、或控制器经由网络&#xff08;如以太网&#xff09;可以和其它设备之间进行通信。 优点 免费、好用、成熟…...

爬虫代理的使用:提升爬虫效率

爬虫代理的基本概念 爬虫代理&#xff0c;简单来说&#xff0c;就是位于客户端和目标服务器之间的一个中转站。当爬虫发起请求时&#xff0c;不是直接发送给目标服务器&#xff0c;而是先发送给代理服务器&#xff0c;再由代理服务器转发给目标服务器。目标服务器响应后&#…...

【gcc】基于gpt和python的流程和延迟梯度分析

Core Flow and Algorithm Concepts of GCC (Google Congestion Control) 【TWCC 】基于gpt和python简化分析webrtc拥塞控制论文: Analysis and Design of the Google Congestion Contro for Web Real-time Communication (WebRTC)参考大神的理解发送码率(send bitrate)影响了网…...

前端CSS总结

目录 前言 正文 CSS基础介绍&#xff1a; CSS选择器&#xff1a; 元素选择器&#xff1a; id和class选择器&#xff1a; 后代选择器和群组选择器&#xff1a; 盒子模型 content&#xff1a; padding&#xff1a; border&#xff1a; margin&#xff1a; 字体样式 …...

Linux/C 高级——指针函数

1.概念 本质是函数&#xff0c;函数的返回值为指针。类比着指针数组。 指针数组&#xff1a;本质是数组&#xff0c;数组中存放指针。 数据类型 *数组名[元素个数]; int a[2][3]; int *arr[2] {a[0],a[1]}; //*(*(arri)j) *(arr[i]j) arr[i][j] 2.定义格式 格式&#xff1a; 数…...

GRU门控循环单元【数学+图解】

文章目录 1、简介2、门控机制3、公式4、图解GRU4.1、重置门和更新门4.2、候选隐藏状态和隐藏状态⭐ 5、LSTM与GRU的对比6、应用7、训练技巧 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff…...

代码随想录算法训练营第六十一天|Bellman_ford 队列优化算法(又名SPFA)、bellman_ford之判断负权回路

卡码网&#xff1a;94. 城市间货物运输 I from collections import dequeclass Edge:def __init__(self, to, val):self.to to # 链接的节点self.val val # 边的权重def main():n, m map(int, input().split())grid [list() for _ in range(n 1)] # 初始化邻接表for _…...

ArrayList集合源码解读(二)已完结

ArrayList集合源码解读&#xff08;二&#xff09; 前言 这篇文章已经把 ArrayList 更完了。各位还想看什么源码可以私信我~~ 上节课带大家阅读了 ArrayList 中的核心扩容代码&#xff0c;那么今天带大家阅读下List集合中我们常用的几个方法的底层实现逻辑&#xff01; 常用…...

光伏逆变器、MPPT、PCS储能变流器、BMU、BCU、BDU和液冷机组

一、光伏逆变器 光伏逆变器&#xff08;PV inverter或solar inverter&#xff09;可以将光伏&#xff08;PV&#xff09;太阳能板产生的可变直流电压转换为市电频率交流电&#xff08;AC&#xff09;的逆变器&#xff0c;可以反馈回商用输电系统&#xff0c;或是供离网的电网使…...

OpenHarmony编译

简介&#xff1a;本文将会介绍编译OpendHarmony环境的搭建、编译、和刷机&#xff08;rk3568&#xff09; 使用场景&#xff1a;修改系统源码&#xff0c;需要验证修改的功能是否正确、编译镜像、编译SDK 1、VS Code&#xff0c;下载链接&#xff0c;用于修改源码 2、linux环…...

C语言典型例题30

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题2.7 从银行贷了一笔款d&#xff0c;准备每月还款额为p&#xff0c;月利率为r&#xff0c;计算多少个月能还清。 设d30000元&#xff0c;p6000元&#xff0c;r1%。对求得的月份取小数点后一位&#xff0c;对第二…...

51单片机(一) --- 入门

一、核心基础概念铺垫 在接触 51 单片机实操前&#xff0c;先理清 CPU、处理器架构、位运算等基础概念&#xff0c;这是理解单片机工作原理的核心前提。 1.1 CPU 与处理器主频 CPU&#xff08;Central Processing Unit&#xff09; 即中央处理器&#xff0c;是所有计算设备的…...

PanSearch网盘影视资源搜索聚合工具源码解析:集成多引擎搜索技术,畅享跨平台资源检索

在数字化信息爆炸的时代&#xff0c;影视资源的获取方式日益多样化&#xff0c;但如何在海量资源中快速定位所需内容&#xff0c;成为用户面临的一大挑战。PanSearch网盘影视资源搜索聚合工具应运而生&#xff0c;它通过集成多引擎搜索技术&#xff0c;支持百度网盘、阿里云盘等…...

09_Neo4j知识体系之行业应用与最佳实践

09_Neo4j知识体系之行业应用与最佳实践 体系 行业应用层&#xff1a;金融反欺诈、智能推荐、社交网络分析、知识图谱构建、供应链优化关联能力&#xff1a;与图建模、路径分析、图算法、GraphRAG、实时决策和企业数据治理密切相关适用对象&#xff1a;解决方案架构师、行业数字…...

前端TypeScript吐槽:别再让你的代码变成类型地狱!

前端TypeScript吐槽&#xff1a;别再让你的代码变成类型地狱&#xff01; 毒舌时刻 前端TypeScript就像安全套——用对了能保护你&#xff0c;用错了会让你难受。TypeScript、tsconfig、类型定义... 一堆TypeScript工具让你晕头转向&#xff0c;结果你的代码要么类型定义复杂得…...

编译原理期末考后复盘:从NFA到DFA最小化,我的Hopcroft算法实战笔记

编译原理期末考后复盘&#xff1a;从NFA到DFA最小化&#xff0c;我的Hopcroft算法实战笔记 刚走出编译原理考场&#xff0c;那种既紧张又兴奋的感觉还萦绕在心头。作为计算机专业的核心课程&#xff0c;编译原理向来以理论抽象、算法复杂著称&#xff0c;而今天的期末考试恰好验…...

安卓手机玩PS1游戏全攻略:DuckStation模拟器0.1-8675版汉化+BIOS配置指南

安卓手机畅玩PS1经典游戏&#xff1a;DuckStation模拟器深度配置指南 还记得那些年在PlayStation上度过的美好时光吗&#xff1f;《最终幻想7》的史诗冒险、《合金装备》的紧张潜入、《生化危机》的惊悚体验&#xff0c;这些经典游戏如今都能在你的安卓手机上完美重现。DuckSta…...

5步激活群晖设备AI人脸识别功能

5步激活群晖设备AI人脸识别功能 【免费下载链接】Synology_Photos_Face_Patch Synology Photos Facial Recognition Patch 项目地址: https://gitcode.com/gh_mirrors/sy/Synology_Photos_Face_Patch 一、诊断被锁定的AI能力 许多群晖用户在使用Synology Photos时会遇到…...

DS4Windows高效配置指南:让PS手柄在PC平台完美运行

DS4Windows高效配置指南&#xff1a;让PS手柄在PC平台完美运行 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows DS4Windows是一款功能强大的开源工具&#xff0c;专为PlayStation手柄提供W…...

QQ音乐加密音频解密实战:qmcdump工具全解析与应用指南

QQ音乐加密音频解密实战&#xff1a;qmcdump工具全解析与应用指南 【免费下载链接】qmcdump 一个简单的QQ音乐解码&#xff08;qmcflac/qmc0/qmc3 转 flac/mp3&#xff09;&#xff0c;仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 在数字…...

LabVIEW+OpenCV摄像头采集避坑指南:从USB摄像头到RTSP网络流,一个VI搞定所有参数设置

LabVIEW与OpenCV融合实战&#xff1a;打造高兼容性视频采集系统的7个关键策略 在工业自动化和机器视觉领域&#xff0c;稳定可靠的视频采集系统是许多项目的基石。LabVIEW作为图形化编程的标杆&#xff0c;与OpenCV这一计算机视觉库的强强联合&#xff0c;为开发者提供了高效解…...