Java8后新特性介绍
1.接口私有方法(Java9)
在Java9之前,interface接口只能定义abstract抽象方法和default默认方法。如果有多个默认方法使用了相同的处理逻辑,那只能写重复代码,或者再单独建个类进行调用。Java9解决了此类问题,其允许在接口中定义private私有方法,减少重用代码和多余的类。比如下面这个例子:
public interface MyInterface { default void method1() { System.out.println("Default method1"); commonMethod(); }default void method2() { System.out.println("Default method2"); commonMethod(); }/** * 这是一段通用的处理逻辑 */ private void commonMethod() { System.out.println("Common method in the interface"); }}
在这个示例中,MyInterface接口有两个默认方法method1()和method2(),它们都调用了私有方法commonMethod(),避免了代码重复。并且当实现MyInterface时,只需要调用method1()或者method2(),无需关心其共同调用的commonMethod()的具体实现。
2.Optional增强(Java9)
stream()
在Java 9之前,如果想对Optional对象中的值进行操作,还得使用ifPresent()方法或者orElse()方法。例如,以下是一个Java 8的例子:
Optional<String> optional = ...;
optional.ifPresent(value -> System.out.println(value.length()));
在Java 9中,可以直接使用stream()方法和Stream的map()方法来达到相同的效果,代码如下:
Optional<String> optional = ...;
optional.stream().map(String::length).forEach(System.out::println);
还是能看出来有了stream()方法后,对于对象的操作也变得方便了许多。
ifPresentOrElse()
这个方法允许提供两个Runnable,第一个在Optional对象包含值时执行,第二个在Optional对象为空时执行。例如下面这两段代码,对比了Java8和Java9中不同的处理:
Optional<String> optionalValue = Optional.of("Hello");
// Java 8if (optionalValue.isPresent()) { System.out.println("Value is present: " + optionalValue.get());} else { System.out.println("Value is absent");}
// Java 9
optionalValue.ifPresentOrElse( value -> System.out.println("Value is present: " + value), () -> System.out.println("Value is absent"));
通过ifPresentOrElse方法,可以更加简洁地处理类似情况,而不再需要频繁使用条件语句。
or()
这个方法允许你在Optional对象为空时,提供一个备选的Optional对象。例如:
Optional<String> optional = Optional.empty();
Optional<String> backup = Optional.of("Backup value");
Optional<String> result = optional.or(() -> backup);
System.out.println(result.get()); // Prints "Backup value"
isEmpty()
用于检查Optional对象是否为空。例如:
Optional<String> optional = Optional.empty();
if (optional.isEmpty()) { System.out.println("Optional is empty");} // Prints "Optional is empty"
其实这个方法等价于!optionalValue.isPresent(),只是不再需要取反
Stream API增强(Java9)
takeWhile()
这个方法接收一个指定条件,它可以从一个有序的Stream中取出满足条件的所有元素,一旦遇到不满足条件的元素,就会停止处理后续元素。例如:
Stream.of("a", "b", "c", "de", "f").takeWhile(s -> s.length() == 1).forEach(System.out::print); // Prints "abc"
在这个例子中,我们使用takeWhile()方法从一个Stream中取出所有长度为1的字符串,直到遇到一个长度不为1的字符串。
dropWhile()
该方法和takeWhile逻辑正好相反,通过指定条件来丢弃Stream流中满足条件的元素,一旦遇到不满足条件的元素,才会开始处理后续元素。
Stream.of("a", "b", "c", "de", "f") .dropWhile(s -> s.length() == 1) .forEach(System.out::print); // Prints "def"
在这个例子中,使用dropWhile()方法丢弃所有长度为1的字符串,直到遇到一个长度不为1的字符串才开始处理后续的逻辑。
ofNullable()
该方法允许我们使用Optional对象来创建流。如果提供的元素为非空,则生成一个包含该元素的流;如果提供的元素为空,则生成一个空流。
Stream.ofNullable(null).forEach(System.out::print); // Prints nothing
iterate()
该方法提供了一个新的重载形式,允许我们指定一个条件来定义流的终止条件,这样可以更灵活地控制Stream流的生成。
Stream<Integer> stream = Stream.iterate(1, n -> n < 10, n -> n * 2);stream.forEach(System.out::print);// Prints 1248
Switch表达式增强(Java12)
在之前的版本中,switch只能作为语句来使用,看下面的示例:
int day = 2;String dayOfWeek;
switch (day) { case 1: dayOfWeek = "Monday"; break; case 2: dayOfWeek = "Tuesday"; break; case 3: dayOfWeek = "Wednesday"; break; case 4: dayOfWeek = "Thursday"; break; case 5: dayOfWeek = "Friday"; break; case 6: dayOfWeek = "Saturday"; break; case 7: dayOfWeek = "Sunday"; break; default: throw new IllegalArgumentException("Invalid day of week: " + day);}System.out.println(dayOfWeek); // Prints "Tuesday"
在Java12以后,switch可以直接作为表达式使用,直接看示例:
int day = 2;
String dayOfWeek = switch (day) { case 1 -> "Monday"; case 2 -> "Tuesday"; case 3 -> "Wednesday"; case 4 -> "Thursday"; case 5 -> "Friday"; case 6 -> "Saturday"; case 7 -> "Sunday"; default -> throw new IllegalArgumentException("Invalid day of week: " + day);
};
System.out.println(dayOfWeek); // Prints "Tuesday"
无论是代码量还是可读性上都有了改进。
instanceof增强(Java16)
在Java 16以前,当我们使用instanceof来检查一个对象是否是某个类型的实例时,如果检查成功,还得显式地将这个对象转型为对应类型,然后才能调用这个类型的方法或访问它的字段。例如:
Object obj = ...;
if (obj instanceof String) { String str = (String) obj; System.out.println(str.length());
}
在这个例子中,我们首先检查obj对象是否是String类型的实例,然后将obj对象转型为String类型,并将结果赋值给str变量,最后调用str变量的length()方法。
但是在Java 16中,可以在instanceof操作符后面直接定义一个变量,这个变量会自动被初始化为转型后的对象,可以直接使用这个变量,再也不用显式转型。例如:
Object obj = ...;
if (obj instanceof String str) { System.out.println(str.length());
}
我们在instanceof操作符后面定义了一个str变量,这个变量自动被初始化为obj对象转型为String类型后的结果,然后我们直接调用str变量的length()方法,无需显式转型。这又是一个利于开发的特性,让代码更加简洁和直观。
相关文章:
Java8后新特性介绍
1.接口私有方法(Java9) 在Java9之前,interface接口只能定义abstract抽象方法和default默认方法。如果有多个默认方法使用了相同的处理逻辑,那只能写重复代码,或者再单独建个类进行调用。Java9解决了此类问题ÿ…...
Arthas monitor(方法执行监控)
文章目录 二、命令列表2.3 monitor/watch/trace/stack/tt 相关2.3.1 monitor(方法执行监控)举例1:监控demo.MathGame类,并且每5S更新一次状态。 二、命令列表 2.3 monitor/watch/trace/stack/tt 相关 使用场景: monit…...
语言的副作用
副作用产生于表达式中有至少一处计算,且其中全部或部分计算会影响表达式其他项,这可能产生副作用。编译器的优化很可能凸显副作用。 赋值 副作用并非都是有害的,比如基本的赋值 a b, 对a而言是产生副作用,但完成了赋值要求。 序…...
centos磁盘逻辑卷LVM创建
centos磁盘逻辑卷LVM创建 一、磁盘逻辑卷LVM说明二、centos磁盘使用情况三、LVM安装指南1.LVM工具安装1. yum list lvm2. yum search lvm3. yum search pvcreate4. yum list lvm25. yum install lvm2 2.创建物理卷2.1磁盘情况查看2.2创建物理卷(PV) 3.创…...
BUUCTF蜘蛛侠呀
解压后发现是流量包,好多icmp包 发现icmp包尾部有$$STRAT打头16进制的字符串,好多重复得。我们只需要提取尾部这些字符串是当icmp的type0时上图标识为褐色的字符串,还需要把16进制的字符串转为对应的字符串(bytes 类型)…...
大数据新视界 --大数据大厂之基于 MapReduce 的大数据并行计算实践
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
win自带录屏怎么用?让视频制作更简单!
win自带录屏怎么用?Windows系统内置的录屏功能,以其便捷高效著称,轻松满足多样化需求。无论是快速捕捉会议要点、制作教学视频,还是直播精彩游戏瞬间,都能一键启动,无缝录制。无需额外安装软件,…...
修改Kali Linux的镜像网站
由于官方的镜像可能会出现连接不上的问题导致无法安装我们所需要的包,所以需要切换镜像站为国内的,以下是一些国内常用的Kali Linux镜像网站,它们提供了与Kali Linux官方网站相同的软件包和资源,但访问速度更快: 清华…...
Docker精讲:基本安装,简单命令及核心概念
docker服务部署 docker是一个容器管理工具,其内部容器才是具体服务,所以我们在安装docker时不需要有太多定制内容,只需要通过yum安装即可 1. 更新系统包 #更新现有依赖包,防止现有依赖包版本过低影响docker安装 yum update2. 安…...
利用git将项目上传到github
采用git而不是在pycharm中共享的原因:可能会出现上图报错 目录 1、创建github仓库2、在 git bash 中初始化Git仓库,添加文件,上传代码 1、创建github仓库 2、在 git bash 中初始化Git仓库,添加文件,上传代码...
828华为云征文 | 华为云X实例CPU性能测试详解与优化策略
目录 引言 1. 测试环境搭建 1.1 测试实例的选择 1.2 CPU性能测试工具介绍 1.3 安装和配置Sysbench 2. CPU性能测试方法 2.1 测试场景设定 2.2 Sysbench单线程CPU性能测试 2.3 Sysbench多线程CPU性能测试(4线程) 2.4 高强度多线程CPU性能测试&a…...
ass字幕文件怎么导入视频mp4?ass字幕怎么编辑?视频加字幕超简单!
ass字幕文件怎么导入视频mp4?ass字幕怎么编辑?在视频制作和观看过程中,添加字幕是一项常见的需求,特别是对于外语视频或需要辅助阅读的场景。ASS(Advanced SubStation Alpha)字幕文件是一种常用的字幕格式&…...
camunda + oracle 启动报错 解决方法
启动报错如下: java.sql.SQLException: sql injection violation, comment not allow : select * from ( select a.*, ROWNUM rnum from (select RES.ID_,RES.REV_,RES.DUEDATE_,RES.PROCESS_INSTANCE_ID_,RES.EXCLUSIVE_from ACT_RU_JOB RESwhere (RES.RETRIES_ &g…...
变幅液压系统比例阀放大器
变幅液压系统是用于控制起重机或类似设备臂架角度变化的关键系统,它通过调节液压缸的伸缩来实现臂架的升降和变幅。以下是一些关于变幅液压系统的基本原理、组成和应用领域的信息: 基本原理:变幅液压系统通常由液压泵、液压缸、液压马达、控制…...
在 Ubuntu 安装 Python3.7(没有弯路)
注:当前Ubuntu版本为18.04 下载Python源码包 wget https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tgz安装前准备 安装依赖组件 apt-get updateapt-get install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libs…...
Linux 简易shell编写
shell shell是壳,外壳的意思,一般我们使用linux系统有用图形化界面的也有使用命令行界面的,这两个都是一种shell,以命令行为例: 如图这个就是我这里的命令行格式,在$符后面写的就是执行的指令,…...
POLYGON Nature - Low Poly 3D Art by Synty 树木植物
一个低多边形资源包,包含可以添加到现有多边形风格游戏中的树木、植物、地形、岩石、道具和特效 FX 资源。 为 POLYGON 系列提供混合样式树这一新增功能。弥合 POLYGON 与更传统的层级资源之间的差距。还提供了一组经典的 POLYGON 风格的树木和植被以满足你的需求。 该包还附带…...
了解什么是瞪羚企业
瞪羚企业”是指以科技创新或商业模式创新为支撑,进入高成长期的中小企业。识别范围主要是符合国家和省战略性新兴产业发展方向的产业领域,涵盖新兴产业、新一代信息技术(包括大数据、物联网和云计算、高端软件、互联网)、生物健康…...
寻找两个正序数的中位数(C)
最近面试,发现要手撕算法加上机试,被完败,索性给自己立一个目标,一周训练2次。 第一题。 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 …...
YOLOv10涨点改进:IoU优化 | Unified-loU,用于高品质目标检测的统一loU ,2024年8月最新IoU
💡💡💡现有IoU问题点:IoU (Intersection over Union)作为模型训练的关键,极大地显示了当前预测框与Ground Truth框之间的差异。后续研究者不断在IoU中加入更多的考虑因素,如中心距离、纵横比等。然而,仅仅提炼几何差异是有上限的;而且新的对价指数与借据本身存在潜在…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
