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

java8、9新特性

JAVA8

Lambda 表达式

(parameters) -> expression

(parameters) ->{ statements; }

提供了一种更为简洁的语法,尤其适用于函数式接口。相比于传统的匿名内部类,Lambda 表达式使得代码更为紧凑,减少了样板代码的编写。
它允许将函数当作参数传递给方法,或者将函数作为返回值,这种支持使得 Java 在函数式编程方面更为灵活,能够更好地处理集合操作、并行计算等任务。

// 传统的匿名内部类
Runnable runnable1 = new Runnable() {@Overridepublic void run() {System.out.println("Hello World!");}
};// 使用 Lambda 表达式
Runnable runnable2 = () -> System.out.println("Hello World!");

方法引用

构造器引用:它的语法是Class::new,或者更一般的Class< T >::new实例如下:

final Car car = Car.create( Car::new );
final List< Car > cars = Arrays.asList( car );

静态方法引用:它的语法是Class::static_method,实例如下:

cars.forEach( Car::collide );

特定类的任意对象的方法引用:它的语法是Class::method实例如下:

cars.forEach( Car::repair );

特定对象的方法引用:它的语法是instance::method实例如下:

final Car police = Car.create( Car::new );
cars.forEach( police::follow );

函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。
Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。
如定义了一个函数式接口如下:

@FunctionalInterface
interface GreetingService 
{void sayMessage(String message);
}

那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):

GreetingService greetService1 = message -> System.out.println("Hello " + message);
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;public class Java8Tester {public static void main(String args[]){List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);// Predicate<Integer> predicate = n -> true// n 是一个参数传递到 Predicate 接口的 test 方法// n 如果存在则 test 方法返回 trueSystem.out.println("输出所有数据:");// 传递参数 neval(list, n->true);// Predicate<Integer> predicate1 = n -> n%2 == 0// n 是一个参数传递到 Predicate 接口的 test 方法// 如果 n%2 为 0 test 方法返回 trueSystem.out.println("输出所有偶数:");eval(list, n-> n%2 == 0 );// Predicate<Integer> predicate2 = n -> n > 3// n 是一个参数传递到 Predicate 接口的 test 方法// 如果 n 大于 3 test 方法返回 trueSystem.out.println("输出大于 3 的所有数字:");eval(list, n-> n > 3 );}public static void eval(List<Integer> list, Predicate<Integer> predicate) {for(Integer n: list) {if(predicate.test(n)) {System.out.println(n + " ");}}}
}

以上这个示例代表 使用n->true 实现Predicate<Integer> predicate的接口函数,此函数返回值作为eval方法的第二个参数,参与下面方法体的执行。

Java 8 接口默认方法

默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。
我们只需在方法名前面加个 default 关键字即可实现默认方法。加static实现静态方法。
即不需要定义这个接口的实现类就可以直接使用该接口的方法

Stream流

数据源:集合,数组,I/O channel, 产生器generator 等
聚合操作:类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

生成流:

  • stream() − 为集合创建串行流。
  • parallelStream() − 为集合创建并行流。

Collectors
Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());System.out.println("筛选列表: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);

日期API

java.time包 LocalDate/LocalTime/LocalDateTime 和 ZonedDateTime

   // 获取当前的日期时间LocalDateTime currentTime = LocalDateTime.now();System.out.println("当前时间: " + currentTime);LocalDate date1 = currentTime.toLocalDate();System.out.println("date1: " + date1);Month month = currentTime.getMonth();int day = currentTime.getDayOfMonth();int seconds = currentTime.getSecond();System.out.println("月: " + month +", 日: " + day +", 秒: " + seconds);LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);System.out.println("date2: " + date2);// 12 december 2014LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);System.out.println("date3: " + date3);// 22 小时 15 分钟LocalTime date4 = LocalTime.of(22, 15);System.out.println("date4: " + date4);// 解析字符串LocalTime date5 = LocalTime.parse("20:15:30");System.out.println("date5: " + date5);}// 获取当前时区时间日期ZonedDateTime date1 = ZonedDateTime.parse("2015-12-03T10:15:30+05:30[Asia/Shanghai]");System.out.println("date1: " + date1);ZoneId id = ZoneId.of("Europe/Paris");System.out.println("ZoneId: " + id);ZoneId currentZone = ZoneId.systemDefault();System.out.println("当期时区: " + currentZone);

Optional 类 Nashorn, JavaScript 引擎 Base64

JAVA9

Stream API

takeWhile 方法

default Stream<T> takeWhile(Predicate<? super T> predicate)

takeWhile() 方法使用一个断言作为参数,返回给定 Stream 的子集直到断言语句第一次返回 false。如果第一个值不满足断言条件,将返回一个空的 Stream。
takeWhile() 方法在有序的 Stream 中,takeWhile 返回从开头开始的尽量多的元素;在无序的 Stream 中,takeWhile 返回从开头开始的符合 Predicate 要求的元素的子集。

import java.util.stream.Stream;public class Tester {public static void main(String[] args) {Stream.of("a","b","c","","e","f").takeWhile(s->!s.isEmpty()).forEach(System.out::print);      } 
}

dropWhile 方法
和 takeWhile 作用相反的,使用一个断言作为参数,直到断言语句第一次返回 false 才返回给定 Stream 的子集。

iterate 方法

static <T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)

方法允许使用初始种子值创建顺序(可能是无限)流,并迭代应用指定的下一个方法。 当指定的 hasNext 的 predicate 返回 false 时,迭代停止。

java.util.stream.IntStream;public class Tester {public static void main(String[] args) {IntStream.iterate(3, x -> x < 10, x -> x+ 3).forEach(System.out::println);} 
}

ofNullable 方法

static <T> Stream<T> ofNullable(T t)

ofNullable 方法可以预防 NullPointerExceptions 异常, 可以通过检查流来避免 null 值。
如果指定元素为非 null,则获取一个元素并生成单个元素流,元素为 null 则返回一个空流。

集合工厂方法

新方法创建集合
Java 9 中,以下方法被添加到 List,Set 和 Map 接口以及它们的重载对象。

static <E> List<E> of(E e1, E e2, E e3);
static <E> Set<E>  of(E e1, E e2, E e3);
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3);
static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)

私有接口方法

在 Java 9 中,一个接口中能定义如下几种变量/方法:
常量
抽象方法 abstract(不写方法体)
默认方法 default
静态方法 static
私有方法 private
私有静态方法 private static

进程API

ProcessHandle 接口来增强 java.lang.Process 类对本地进程的支持

相关文章:

java8、9新特性

JAVA8 Lambda 表达式 (parameters) -> expression 或 (parameters) ->{ statements; } 提供了一种更为简洁的语法&#xff0c;尤其适用于函数式接口。相比于传统的匿名内部类&#xff0c;Lambda 表达式使得代码更为紧凑&#xff0c;减少了样板代码的编写。 它允许将函…...

作业:zuoye

1.闹钟&#xff08;错的&#xff09; #include "widget.h" #include "ui_widget.h" #include <QMessageBox>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 初始化定时器objTimer new QTimer(th…...

redis底层数据结构——链表

文章目录 定义内部实现总结 定义 链表提供了高效的节点重排能力&#xff0c;以及顺序性的节点访间方式&#xff0c;并且可以通过增删节点来灵活地调整链表的长度。 作为一种常用数据结构&#xff0c;链表内置在很多高级的编程语言里面&#xff0c;因为Redis使用的C语言并没有…...

问题解决 4S 法

在深入研读《像高手一样解决问题》的第二章后&#xff0c;犹如打开了一扇通往高效问题解决领域的新大门&#xff0c;其中所阐述的问题解决 4S 法&#xff0c;更是给人以拨云见日之感。 一、陈述&#xff08;State&#xff09;&#xff1a;明确问题本质 这是问题解决的起始点&…...

SQL-leetcode—1407. 排名靠前的旅行者

1407. 排名靠前的旅行者 表&#xff1a;Users ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | ---------------------- id 是该表中具有唯一值的列。 name 是用户名字。 表&#xff1a;Rides -------------------…...

机器学习(李宏毅)——Transformer

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记&#xff0c;感谢台湾大学李宏毅教授的课程&#xff0c;respect&#xff01;&#xff01;&#xff01; 读这篇文章必须先了解self-attention&#xff0c;可参阅我上一篇。 二、大纲 Transformer问世原理剖析模型训…...

React进阶之React状态管理CRA

React状态管理&CRA 状态管理理论讲解案例 context 上下文结合状态来维护todoListindex.jsApp.jsTaskList.jsTasksContext.jsAddTask.js Escape 脱围机制refforwardRef&#xff08;不建议使用&#xff09; CRA 状态管理 理论讲解 如何针对 effect -> 对action的触发 -&…...

攻克AWS认证机器学习工程师(AWS Certified Machine Learning Engineer) - 助理级别认证:我的成功路线图

引言 当我决定考取AWS认证机器学习工程师 - 助理(AWS Certified Machine Learning Engineer — Associate)级别证书时,我就预料到这将是一段充满挑战但回报颇丰的旅程。跟你说吧,它在这两方面都没让我失望。这项考试面向的是不仅理解机器学习原理,还对AWS生态系统有扎实基…...

前端开发环境

vscde nrm 切换源管理 nvm 切换node版本工具 nodemon node运行js文件热更新 pxcook 易用的自动标注工具, 生成前端代码, 设计研发协作利器,比PS轻量 TypeScript 安装tsc 它的作用就是将ts文件编译为js文件 npm i typescript -g 输入tsc -v能够看到东西&#xff0c;就说明好了 …...

Web自动化测试—测试用例流程设计

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、测试用例通用结构回顾 1.1、现有测试用例存在的问题 可维护性差可读性差稳定性差 1.2、用例结构设计 测试用例的编排测试用例的项目结构 1.3、自动化测试…...

HTML全局属性与Meta元信息详解:优化网页的灵魂

目录 前言 一、HTML中的全局属性 常用的全局属性 二、Meta元信息标签&#xff1a;网页背后的重要配置 常用的Meta标签 三、Meta元信息的进阶使用 总结 前言 在HTML开发中&#xff0c;有一些属性和标签是全局性的&#xff0c;能够影响网页的多个方面&#xff0c;比如页面的…...

day001 折半查找/二分查找

day001 折半查找/二分查找 适用场景顺序表或者顺序数组 时间复杂度&#xff1a;log2N 算法思路 pre: 下限为0&#xff0c;上限为数组长度-1&#xff0c; 下限小于等于上限进行循环 if 比较目标值和中间值&#xff0c;if 大于: 则下限中间值索引1else: 小于: 则上限中间值索…...

Linux 资源监控:优化与跟踪系统性能

在 Evoxt&#xff0c;我们深知有效的 Linux 资源监控对于优化服务器性能至关重要。本指南将介绍关键工具和策略&#xff0c;帮助您监控 CPU、内存、磁盘和网络使用情况&#xff0c;确保您的 Linux 系统始终保持高效运行。 实时系统监控 使用 top&#xff08;交互式系统监控&am…...

java安全中的类加载

java安全中的类加载 提前声明: 本文所涉及的内容仅供参考与教育目的&#xff0c;旨在普及网络安全相关知识。其内容不代表任何机构、组织或个人的权威建议&#xff0c;亦不构成具体的操作指南或法律依据。作者及发布平台对因使用本文信息直接或间接引发的任何风险、损失或法律纠…...

Node.js调用DeepSeek Api 实现本地智能聊天的简单应用

在人工智能快速发展的今天&#xff0c;如何快速构建一个智能对话应用成为了开发者们普遍关注的话题。本文将为大家介绍一个基于Node.js的命令行聊天应用&#xff0c;它通过调用硅基流动&#xff08;SiliconFlow&#xff09;的API接口&#xff0c;实现了与DeepSeek模型的智能对话…...

分布式服务框架 如何设计一个更合理的协议

1、概述 前面我们聊了如何设计一款分布式服务框架的问题&#xff0c;并且编码实现了一个简单的分布式服务框架 cheese, 目前 cheese 基本具备分布式服务框架的基本功能。后面我们又引入了缓存机制&#xff0c;以及使用Socket替代了最开始的 RestTemplate。并且还学习了网络相关…...

Unity使用iTextSharp导出PDF-02基础结构及设置中文字体

基础结构 1.创建一个Document对象 2.使用PdfWriter创建PDF文档 3.打开文档 4.添加内容&#xff0c;调用文档Add方法添加内容时&#xff0c;内容写入到输出流中 5.关闭文档 using UnityEngine; using iTextSharp.text; using System.IO; using iTextSharp.text.pdf; using Sys…...

Kafka因文件句柄数过多导致挂掉的排查与解决

一、问题现象 在k8s集群中部署了多个服务&#xff0c;包括Kafka、TDengine集群和Java等。这些服务使用NFS作为持久化存储方案。最近遇到了一个问题&#xff1a;Kafka频繁报错并最终挂掉。错误日志如下&#xff1a; 2025-02-09T09:39:07,022] INF0 [LogLoader partition__cons…...

【LeetCode Hot100 多维动态规划】最小路径和、最长回文子串、最长公共子序列、编辑距离

多维动态规划 机器人路径问题思路代码实现 最小路径和问题动态规划思路状态转移方程边界条件 代码实现 最长回文子串思路代码实现 最长公共子序列&#xff08;LCS&#xff09;题目描述解决方案 —— 动态规划1. 状态定义2. 状态转移方程3. 初始化4. 代码实现 编辑距离&#xff…...

PRC框架-Dubbo

RPC框架 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;框架是一种允许客户端通过网络调用服务器端程序的技术。以下是常见的RPC框架及其特点&#xff1a; 1. 基于HTTP/REST的RPC框架 特点&#xff1a;简单易用&#xff0c;与Web开发无缝集成&am…...

智能检测摄像头模块在客流统计中的应用

工作原理 基于视频分析技术&#xff1a;智能检测摄像头模块通过捕捉监控区域内的视频画面&#xff0c;运用图像识别算法对视频中的人体进行检测、跟踪和分析。可以识别出人体的轮廓、姿态等特征&#xff0c;进而区分不同的个体&#xff0c;实现对客流的统计。 基于红外感应技…...

[LLM面试题] 指示微调(Prompt-tuning)与 Prefix-tuning区别

一、提示调整(Prompt Tuning) Prompt Tuning是一种通过改变输入提示语&#xff08;input prompt&#xff09;以获得更优模型效果的技术。举个例子&#xff0c;如果我们想将一条英语句子翻译成德语&#xff0c;可以采用多种不同的方式向模型提问&#xff0c;如下图所示&#xf…...

【CubeMX+STM32】SD卡 U盘文件系统 USB+FATFS

本篇&#xff0c;将使用CubeMXKeil, 创建一个 USBTF卡存储FatFS 的虚拟U盘读写工程。 目录 一、简述 二、CubeMX 配置 SDIO DMA FatFs USB 三、Keil 编辑代码 四、实验效果 串口助手&#xff0c;实现效果&#xff1a; U盘&#xff0c;识别效果&#xff1a; 一、简述 上…...

在JVM的栈(虚拟机栈)中,除了栈帧(Stack Frame)还有什么?

在JVM的栈&#xff08;虚拟机栈&#xff09;中&#xff0c;除了栈帧&#xff08;Stack Frame&#xff09;&#xff0c;还有其他一些与方法调用相关的重要信息。栈的主要作用是存储方法调用的执行过程中的上下文信息&#xff0c;栈帧是其中最关键的组成部分。 栈的组成 栈帧&am…...

# 解析Excel文件:处理Excel xlsx file not supported错误 [特殊字符]

解析Excel文件&#xff1a;处理Excel xlsx file not supported错误 &#x1f9e9; 嘿&#xff0c;数据分析的小伙伴们&#xff01;&#x1f44b; 我知道在处理Excel文件的时候&#xff0c;很多人可能会遇到这样一个错误&#xff1a;Excel xlsx file not supported。别担心&…...

图片下载不下来?即便点了另存为也无法下载?两种方法教你百分之百下载下来

前言&#xff0c;我要讲的是网站没有禁鼠标右键&#xff0c;可以右键&#xff0c;也可以打开控制台&#xff0c;图片也不用付费这种。 一、用鼠标按住图片直接往桌面拖动&#xff0c;也可以打开开发者工具&#xff0c;在里面往外拖。 二、这个方法很有意思&#xff0c;在电脑的…...

Unity项目实战-Player玩家控制脚本实现

玩家控制脚本设计思路 1. 代码演变过程 1.1 初始阶段&#xff1a;单一Player类实现 最初的设计可能是一个包含所有功能的Player类&#xff1a; public class Player : MonoBehaviour {private CharacterController controller;private Animator animator;[SerializeField] …...

CP AUTOSAR标准之ICUDriver(AUTOSAR_SWS_ICUDriver)(更新中……)

1 简介和功能概述 该规范指定了AUTOSAR基础软件模块ICU驱动程序的功能、API和配置。   ICU驱动程序是一个使用输入捕获单元(ICU)来解调PWM信号、计数脉冲、测量频率和占空比、生成简单中断和唤醒中断的模块。   ICU驱动程序提供服务 信号边缘通知控制唤醒中断周期信号时间测…...

Python3 ImportError: cannot import name ‘XXX‘ from ‘XXX‘

个人博客地址&#xff1a;Python3 ImportError: cannot import name XXX from XXX | 一张假钞的真实世界 例如如下错误&#xff1a; $ python3 git.py Traceback (most recent call last):File "git.py", line 1, in <module>from git import RepoFile &quo…...

[学习笔记] Kotlin Compose-Multiplatform

Compose-Multiplatform 原文&#xff1a;https://github.com/zimoyin/StudyNotes-master/blob/master/compose-multiplatform/compose.md Compose Multiplatform 是 JetBrains 为桌面平台&#xff08;macOS&#xff0c;Linux&#xff0c;Windows&#xff09;和Web编写Kotlin UI…...