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

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.接口私有方法&#xff08;Java9&#xff09; 在Java9之前&#xff0c;interface接口只能定义abstract抽象方法和default默认方法。如果有多个默认方法使用了相同的处理逻辑&#xff0c;那只能写重复代码&#xff0c;或者再单独建个类进行调用。Java9解决了此类问题&#xff…...

Arthas monitor(方法执行监控)

文章目录 二、命令列表2.3 monitor/watch/trace/stack/tt 相关2.3.1 monitor&#xff08;方法执行监控&#xff09;举例1&#xff1a;监控demo.MathGame类&#xff0c;并且每5S更新一次状态。 二、命令列表 2.3 monitor/watch/trace/stack/tt 相关 使用场景&#xff1a; monit…...

语言的副作用

副作用产生于表达式中有至少一处计算&#xff0c;且其中全部或部分计算会影响表达式其他项&#xff0c;这可能产生副作用。编译器的优化很可能凸显副作用。 赋值 副作用并非都是有害的&#xff0c;比如基本的赋值 a b, 对a而言是产生副作用&#xff0c;但完成了赋值要求。 序…...

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创建物理卷&#xff08;PV&#xff09; 3.创…...

BUUCTF蜘蛛侠呀

解压后发现是流量包&#xff0c;好多icmp包 发现icmp包尾部有$$STRAT打头16进制的字符串&#xff0c;好多重复得。我们只需要提取尾部这些字符串是当icmp的type0时上图标识为褐色的字符串&#xff0c;还需要把16进制的字符串转为对应的字符串&#xff08;bytes 类型&#xff09…...

大数据新视界 --大数据大厂之基于 MapReduce 的大数据并行计算实践

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

win自带录屏怎么用?让视频制作更简单!

win自带录屏怎么用&#xff1f;Windows系统内置的录屏功能&#xff0c;以其便捷高效著称&#xff0c;轻松满足多样化需求。无论是快速捕捉会议要点、制作教学视频&#xff0c;还是直播精彩游戏瞬间&#xff0c;都能一键启动&#xff0c;无缝录制。无需额外安装软件&#xff0c;…...

修改Kali Linux的镜像网站

由于官方的镜像可能会出现连接不上的问题导致无法安装我们所需要的包&#xff0c;所以需要切换镜像站为国内的&#xff0c;以下是一些国内常用的Kali Linux镜像网站&#xff0c;它们提供了与Kali Linux官方网站相同的软件包和资源&#xff0c;但访问速度更快&#xff1a; 清华…...

Docker精讲:基本安装,简单命令及核心概念

docker服务部署 docker是一个容器管理工具&#xff0c;其内部容器才是具体服务&#xff0c;所以我们在安装docker时不需要有太多定制内容&#xff0c;只需要通过yum安装即可 1. 更新系统包 #更新现有依赖包&#xff0c;防止现有依赖包版本过低影响docker安装 yum update2. 安…...

利用git将项目上传到github

采用git而不是在pycharm中共享的原因&#xff1a;可能会出现上图报错 目录 1、创建github仓库2、在 git bash 中初始化Git仓库&#xff0c;添加文件&#xff0c;上传代码 1、创建github仓库 2、在 git bash 中初始化Git仓库&#xff0c;添加文件&#xff0c;上传代码...

828华为云征文 | 华为云X实例CPU性能测试详解与优化策略

目录 引言 1. 测试环境搭建 1.1 测试实例的选择 1.2 CPU性能测试工具介绍 1.3 安装和配置Sysbench 2. CPU性能测试方法 2.1 测试场景设定 2.2 Sysbench单线程CPU性能测试 2.3 Sysbench多线程CPU性能测试&#xff08;4线程&#xff09; 2.4 高强度多线程CPU性能测试&a…...

ass字幕文件怎么导入视频mp4?ass字幕怎么编辑?视频加字幕超简单!

ass字幕文件怎么导入视频mp4&#xff1f;ass字幕怎么编辑&#xff1f;在视频制作和观看过程中&#xff0c;添加字幕是一项常见的需求&#xff0c;特别是对于外语视频或需要辅助阅读的场景。ASS&#xff08;Advanced SubStation Alpha&#xff09;字幕文件是一种常用的字幕格式&…...

camunda + oracle 启动报错 解决方法

启动报错如下&#xff1a; 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…...

变幅液压系统比例阀放大器

变幅液压系统是用于控制起重机或类似设备臂架角度变化的关键系统&#xff0c;它通过调节液压缸的伸缩来实现臂架的升降和变幅。以下是一些关于变幅液压系统的基本原理、组成和应用领域的信息&#xff1a; 基本原理&#xff1a;变幅液压系统通常由液压泵、液压缸、液压马达、控制…...

在 Ubuntu 安装 Python3.7(没有弯路)

注&#xff1a;当前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是壳&#xff0c;外壳的意思&#xff0c;一般我们使用linux系统有用图形化界面的也有使用命令行界面的&#xff0c;这两个都是一种shell&#xff0c;以命令行为例&#xff1a; 如图这个就是我这里的命令行格式&#xff0c;在$符后面写的就是执行的指令&#xff0c;…...

POLYGON Nature - Low Poly 3D Art by Synty 树木植物

一个低多边形资源包,包含可以添加到现有多边形风格游戏中的树木、植物、地形、岩石、道具和特效 FX 资源。 为 POLYGON 系列提供混合样式树这一新增功能。弥合 POLYGON 与更传统的层级资源之间的差距。还提供了一组经典的 POLYGON 风格的树木和植被以满足你的需求。 该包还附带…...

了解什么是瞪羚企业

瞪羚企业”是指以科技创新或商业模式创新为支撑&#xff0c;进入高成长期的中小企业。识别范围主要是符合国家和省战略性新兴产业发展方向的产业领域&#xff0c;涵盖新兴产业、新一代信息技术&#xff08;包括大数据、物联网和云计算、高端软件、互联网&#xff09;、生物健康…...

寻找两个正序数的中位数(C)

最近面试&#xff0c;发现要手撕算法加上机试&#xff0c;被完败&#xff0c;索性给自己立一个目标&#xff0c;一周训练2次。 第一题。 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 …...

YOLOv10涨点改进:IoU优化 | Unified-loU,用于高品质目标检测的统一loU ,2024年8月最新IoU

💡💡💡现有IoU问题点:IoU (Intersection over Union)作为模型训练的关键,极大地显示了当前预测框与Ground Truth框之间的差异。后续研究者不断在IoU中加入更多的考虑因素,如中心距离、纵横比等。然而,仅仅提炼几何差异是有上限的;而且新的对价指数与借据本身存在潜在…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...