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

JDK8-17新特性

一、JDK8新特性:Lambda表达式

1.Lambda表达式及其使用举例

Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

Comparator<Integer> com1 =new Comparator<Integer>(){@Overridepublic int compare(Integer o1,Integer o2){return Integer.compare(o1,o2);}
};
Comparator<Integer>com2 = (Integer o1,Integer o2)->{return Integer.compare(o1,o2);
};

(1)lambda表达式使用:

->:lambda操作符或箭头操作符
->的左边:lambda形参列表,对应着要重写的接口中的抽象方法的形参列表,由一对小括号表示
->的右边:lambda体,对应着接口的实现类要重写的方法的方法体,由一对中括号表示
形参列表中的数据类型可以省略,因为可由编译器推断得出,称为"类型推断"
lambda表达式若只需要一个参数时形参列表的小括号可以省略
lambda体只有一条语句时return与大括号都可以省略,两个需要同时省略

(2)lambda表达式的本质:

a.lambda表达式作为接口的实现类的对象;

b.lambda表达式是一个匿名函数

2.函数式接口:

(1)概念:如果接口中只声明一个抽象方法,则此接口称为函数式接口;因为只有给函数式接口提供实现类的对象时才可以使用lambda表达式;

(2)API中函数式接口所在的包:java.util.function

(3)4个基本的函数式接口

(4)消费型接口:有形参,但是返回值为void

(5)供给型接口:无形参,有返回值

(6)函数型接口:既有参数也有返回值

(7)判断型接口:有形参,返回值是boolean的结果

3.Lambda表达式的语法规则:

->:lambda操作符或箭头操作符
1.->的左边:lambda形参列表,对应着要重写的接口中的抽象方法的形参列表,由一对小括号表示
参数的类型都可以省略;如果形参只有一个则一对()也可以省略;
2.->的右边:lambda体,对应着接口的实现类要重写的方法的方法体,由一对{}表示
如果方法体中只有一条执行语句则{}可以省略;如果有return关键字则必须一并省略;

二、方法引用

1.方法引用的理解:

(1)方法引用可以看作是Lambda表达式的进一步刻画;

(2)当需要提供一个函数式接口的实例时可以使用lambda表达式提供此实例;

(3)当满足一定的条件的情况下还可以使用方法引用或构造器引用替换lambda表达式;

2.方法引用的本质:方法引用作为了函数式接口的实例

3.使用格式:

类(或对象)::方法名
情况1:对象名::实例方法名
函数式接口中的抽象方法a与其内部实现时调用的对象的某个方法b的形参列表和返回值类型都相同,
此时可以考虑使用方法b实现对方法a的替换、覆盖;此方法b是非静态的方法、需要对象调用;
情况2:类名::静态方法名
函数式接口中的抽象方法a与其内部实现时调用的类的某个静态方法b的形参列表和返回值类型都一致,
此时可以考虑使用方法b实现对方法a的替换、覆盖;此方法b是静态的方法、需要类调用;
情况3:类名::实例方法名
函数式接口中的抽象方法a与其内部实现时调用的对象的某个方法b的返回值类型相同;
同时抽象
方法a中有n个参数,方法b中有n-1个参数,且抽象方法a的第一个参数为方法b的调用者并且抽象方法a的后n-1个参数的类型相同或一致,此时可以考虑使用方法b实现对方法a的替换、覆盖;
此方法b是非静态的方法,需要对象调用,但是形式上写成对象a所属的类;

三、构造器引用

1.格式:

类名::new

2.说明:

(1)调用了类名对应的类中的某一个确定的构造器;

(2)具体调用的构造器取决于函数式接口的抽象方法的形参列表;

四、StreamAPI:

1.说明:

Stream API(java.util.stream)把真正的函数式编程风格引入到Java中。这是目前为止对Java类库最好的补充,因为Stream API可以极大提供Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。Stream是Java8中处理集合的关键抽象概念,可以指定希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作就类似于使用 SQL执行的数据库查询。也可以使用Stream API来并行执行操作。简言之Stream API提供了一种高效且易于使用的处理数据的方式。

2.Stream API与集合框架的对比:

(1)Stream API关注的是多个数据的计算(排序、查找、过滤、映射、遍历等)是面向CPU的,集合关注的数据的存储是面向内存的;

(2)Stream API之于集合类似于SQL之于数据表的查询;

3.注意事项:

(1)Stream自己不会存储元素

(2)Stream不会改变源对象。相反会返回一个持有结果的新Stream。

(3)Stream操作是延迟执行的。这意味着会等到需要结果的时候才执行。即一旦执行终止操作,就执行中间操作链,并产生相应的结果;

(4)Stream一旦执行了终止操作就不能再调用其它中间操作或终止操作;

4.Stream执行流程:

1.Stream实例化
(1)通过集合获取Stream的实例:
a.default Stream<E> stream():返回一个顺序流
b.default Stream<E> parallelStream():返回一个并行流
(2)通过数组获取Stream的实例:
a.Arrays工具类中的方法:static <T> Stream<T> stream(T[] array);
(3)通过Stream类中的静态of()方法
2.一系列的中间操作
每次处理都会返回一个持有结果的新Stream,即中间操作的方法返回值仍然是Stream类型的对象;
因此中间操作可以是个操作链,可对数据源的数据进行n次处理,但是在终结操作前并不会真正执行;
(1)筛选与切片
a.filter(Predicatep):接收Lambda,从流中排除某些元素;
b.distinct():筛选,通过流所生成元素的hashCode()和equals()去除重复元素;
c.limit(long maxSize):截断流,使其元素不超过给定数量;
d.skip(long n):跳过元素,返回一个扔掉了前n个元素的流;若流中元素不足n个则返回一个空流,与limit(n)互补;
(2)映射:
a.map(Function f):接收一个函数作为参数,该函数会应用到每个元素并将其映射成一个新的元素;
b.mapToDouble(ToDoubleFunction f):接收一个函数作为参数,该函数会应用到每个元素上,产生一个新的DoubleStream;
c.mapToInt(ToIntFunction f):接收一个函数作为参数,该函数会应用到每个元素上产生一个新的IntStream;
d.mapToLong(ToLongFunction f):接收一个函数作为参数,该函数会应用到每个元素上产生一个新的LongStream;
e.flatMap(Function f):接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流;
(3)排序:
a.sorted():产生一个新流,其中按自然顺序排序;
b.sorted(Comparator com):产生一个新流,其中按比较器顺序排序;
3.终止操作
终止操作的方法返回值类型就不再是Stream了,因此一旦执行终止操作就结束整个stream操作;
一旦执行终止操作就执行中间操作链,最终产生结果并结束Stream;
(1)匹配与查找:
a.allMatch(Predicate p):检查是否匹配所有元素
b.anyMatch(Predicate p):检查是否至少匹配一个元素
c.noneMatc(Predicate p):检查是否没有匹配所有元素
d.findFirst():返回第一个元素
e.findAny():返回当前流中的任意元素
f.count():返回流中元素总数
g.max(Comparator c):返回流中最大值
h.min(Comparator c):返回流中最小值
i.forEach(Consumer c):内部迭代(使用Collection接口需要用户去做选代,称为外部迭代.相反,Stream API使用内部迭代)
(2)规约:
a.reduce(T identity, BinaryOperator b):可以将流中元素反复结合起来得到一个值,返回T;
b.reduce(Binaryoperator b):可以将流中元素反复结合起来得到一个值,返回Optional<T>
(3)收集:
collect(Collector c):将流转换为其他形式,接收一个Collector接口的实现,用于给Stream中元素做汇总的方法;

相关文章:

JDK8-17新特性

一、JDK8新特性:Lambda表达式 1.Lambda表达式及其使用举例 Lambda是一个匿名函数&#xff0c;我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格&#xff0c;使Java的语言表达能力…...

文件加载的管理:探索三种方法

目录 1. 空闲表法和空闲链表法 空闲表法 优点 缺点 示例 空闲链表法 优点 缺点 示例 优缺点对比 适用场景 综合示例 2. 位图法 概述 优点 缺点 适用场景 示例 位图法的操作 3. 成组链接法 概述 优点 缺点 适用场景 示例 实现细节 结语 在计算机系统中…...

【机器学习】基于Transformer架构的移动设备图像分类模型MobileViT

1.引言 1.1. MobileViT是什么&#xff1f; MobileViT是一种基于Transformer的轻量级视觉模型&#xff0c;专为移动端设备上的图像分类任务而设计。 背景与目的&#xff1a; MobileViT由Google在2021年提出&#xff0c;旨在解决移动设备上的实时图像分类需求。与传统的卷积神…...

grub引导LinuxMint

注意事项&#xff1a;文件系统必须是FAT32 安装 sudo apt install gparted -y 分区管理软件 使用gparted分区和查看设备路径 sudo apt-get install grub-efi-amd64 #/dev/sdd1 是需要制作分区引导的设备路径 sudo mount /dev/sdd1 /mnt/123 #bios sudo grub-install --targe…...

Hadoop 2.0:主流开源云架构(四)

目录 五、Hadoop 2.0访问接口&#xff08;一&#xff09;访问接口综述&#xff08;二&#xff09;浏览器接口&#xff08;三&#xff09;命令行接口 六、Hadoop 2.0编程接口&#xff08;一&#xff09;HDFS编程&#xff08;二&#xff09;Yarn编程 五、Hadoop 2.0访问接口 &am…...

PythonSQL应用随笔4——PySpark创建SQL临时表

零、前言 Python中直接跑SQL&#xff0c;可以很好的解决数据导过来导过去的问题&#xff0c;本文方法主要针对大运算量时&#xff0c;如何更好地让Python和SQL打好配合。 工具&#xff1a;Zeppelin 语法&#xff1a;PySpark&#xff08;Apache Spark的Python API&#xff09;…...

C# OpenCvSharp 矩阵计算-determinant、trace、eigen、calcCovarMatrix、solve

🚀 在C#中使用OpenCvSharp库进行矩阵操作和图像处理 在C#中使用OpenCvSharp库,可以实现各种矩阵操作和图像处理功能。以下是对所列函数的详细解释和示例,包括运算过程和结果。📊✨ 1. determinant - 计算行列式 🧮 定义: double determinant(InputArray mtx); 参数…...

知识普及:什么是边缘计算(Edge Computing)?

边缘计算是一种分布式计算架构&#xff0c;它将数据处理、存储和服务功能移近数据产生的边缘位置&#xff0c;即接近数据源和用户的位置&#xff0c;而不是依赖中心化的数据中心或云计算平台。边缘计算的核心思想是在靠近终端设备的位置进行数据处理&#xff0c;以降低延迟、减…...

大型企业IT基础架构和应用运维体系

大型企业IT基础架构和应用运维体系 在数字化转型的浪潮中&#xff0c;大型企业面临着日益复杂的IT环境。高效的IT基础架构和应用运维体系&#xff0c;是确保企业业务连续性和竞争力的关键。本文将探讨大型企业如何构建强健的IT基础架构&#xff0c;并建立高效的应用运维体系&a…...

【源码】16国语言交易所源码/币币交易+期权交易+秒合约交易+永续合约+交割合约+新币申购+投资理财/手机端uniapp纯源码+PC纯源码+后端PHP

测试环境&#xff1a;Linux系统CentOS7.6、宝塔面板、Nginx、PHP7.3、MySQL5.6&#xff0c;根目录public&#xff0c;伪静态laravel5&#xff0c;开启ssl证书 语言&#xff1a;16种&#xff0c;看图 这套带前端uniapp纯源码&#xff0c;手机端和pc端都有纯源码&#xff0c;后…...

word空白页删除不了怎么办?

上方菜单栏点击“视图”&#xff0c;下方点击“大纲视图”。找到文档分页符的位置。将光标放在要删除的分节符前&#xff0c;按下键盘上的“Delet”键删除分页符。...

Java web应用性能分析之【prometheus+Grafana监控springboot服务和服务器监控】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 Java web应用性能分析之【jvisualvm远程连接云服务器】-CSDN博客 Java web应用性能分析之【java进程问题分析定位】-CSDN博客 Java web应用性能分析之【…...

JavaEE——声明式事务管理案例:实现用户登录

一、案例要求 本案例要求在控制台输入用户名密码&#xff0c;如果用户账号密码正确则显示用户所属班级&#xff0c;如果登录失败则显示登录失败。实现用户登录项目运行成功后控制台效果如下所示。 欢迎来到学生管理系统 请输入用户名&#xff1a; zhangsan 请输入zhangsan的密…...

解决用Three.js实现嘴型和语音同步时只能播放部分部位的问题 Three.js同时渲染播放多个组件变形动画的方法

前言 参考这篇文章ThreeJSChatGPT 实现前端3D数字人AI互动&#xff0c;前面搭后端、训练模型组内小伙伴都没有什么问题&#xff0c;到前端的时候&#xff0c;脸部就出问题了。看我是怎么解决的。 好文章啊&#xff0c;可惜百度前几个都找不到&#xff0c;o(╥﹏╥)o 问题情况 …...

阅读笔记:明朝那些事儿太监弄乱的王朝

阅读豆评高分作品《明朝那些事儿太监弄乱的王朝》第三部&#xff0c;截止到今天告一段落了&#xff0c;前两部皇帝&#xff0c;太子相对比较少&#xff0c;了解故事的主线&#xff0c;分支不算多&#xff0c;记忆起来还能应付过来&#xff0c;第三部皇帝&#xff0c;太子更换的…...

算法第六天:力扣第977题有序数组的平方

一、977.有序数组的平方的链接与题目描述 977. 有序数组的平方的链接如下所示&#xff1a;https://leetcode.cn/problems/squares-of-a-sorted-array/description/https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 给你一个按 非递减顺序 排序的整数数组…...

设计模式学习(二)工厂模式——工厂方法模式

设计模式学习&#xff08;二&#xff09;工厂模式——工厂方法模式 前言工厂方法模式简介示例优点缺点使用场景 前言 前一篇文章介绍了简单工厂模式&#xff0c;提到了简单工厂模式的缺点&#xff08;违反开闭原则&#xff0c;扩展困难&#xff09;&#xff0c;本文要介绍的工…...

TCP与UDP案例

udp不会做拆分整合什么的 多大就是多大...

Adaboost集成学习 | Matlab实现基于CNN-LSTM-Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料 效果一览 基本介绍 Adaboost集成学习 | Matlab实现基于CNN-LSTM-Adaboost集成学习时间序列预测&#xff08;股票价格预测&#xff09; 模型设计 融合Adaboost的CNN-LSTM模型的时间序列预测&#xff0c;下面是一个基本的框架。 …...

你焦虑了吗

前段时间&#xff0c;无意间在图书馆看到一本书《认知觉醒》&#xff0c;书中提到了焦虑的相关话题&#xff0c;从焦虑的根源&#xff0c;焦虑的形式&#xff0c;如何破解焦虑给了我点启示&#xff0c;分享给一下。 引语&#xff1a; 焦虑肯定是你的老朋友了&#xff0c;它总像…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...