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中元素做汇总的方法;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/351012.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用PyTorch实现LSTM生成ai诗

最近学习torch的一个小demo。 什么是LSTM&#xff1f; 长短时记忆网络&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;是一种循环神经网络&#xff08;RNN&#xff09;的变体&#xff0c;旨在解决传统RNN在处理长序列时的梯度消失和梯度爆炸问题。LSTM引入了…

初识PHP

一、格式 每行以分号结尾 <?phpecho hello; ?>二、echo函数和print函数 作用&#xff1a;两个函数都是输出内容到页面中&#xff0c;多用于代码调试。 <?php echo "<h1 styletext-align: center;>test</h1>"; print "<h1 stylet…

笔记 | 用go写个docker

仅作为自己学习过程的记录&#xff0c;不具备参考价值 前言 看到一段非常有意思的话&#xff1a; 很多人刚接触docker的时候就会感觉非常神奇&#xff0c;感觉这个技术非常新颖&#xff0c;其实并不然&#xff0c;docker使用到的技术都是之前已经存在过的&#xff0c;只不过旧…

如何在Spring Boot中实现图片上传至本地和阿里云OSS

在开发Web应用时&#xff0c;处理文件上传是常见的需求之一&#xff0c;尤其是在涉及到图片、视频等多媒体数据时。本文将详细介绍如何使用Spring Boot实现图片上传至本地服务器以及阿里云OSS存储服务&#xff0c;并提供完整的代码示例。 一、上传图片至本地 首先&#xff0c…

CMU最新论文:机器人智慧流畅的躲避障碍物论文详细讲解

CMU华人博士生Tairan He最新论文&#xff1a;Agile But Safe: Learning Collision-Free High-Speed Legged Locomotion 代码开源&#xff1a;Code: https://github.com/LeCAR-Lab/ABS B站实际效果展示视频地址&#xff1a;bilibili效果地址 我会详细解读论文的内容,让我们开始吧…

这个网站有点意思,可做SPRINGBOOT的启动图

在 SpringBoot 项目的 resources 目录下新建一个 banner.txt 文本文件&#xff0c;然后将启动 Banner 粘贴到此文本文件中&#xff0c;启动项目&#xff0c;即可在控制台展示对应的内容信息。 下面这个工具很好用&#xff0c;收藏精哦

C/C++:指针用法详解

C/C&#xff1a;指针 指针概念 指针变量也是一个变量 指针存放的内容是一个地址&#xff0c;该地址指向一块内存空间 指针是一种数据类型 指针变量定义 内存最小单位&#xff1a;BYTE字节&#xff08;比特&#xff09; 对于内存&#xff0c;每个BYTE都有一个唯一不同的编号…

积木搭建游戏-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第83讲。 积木搭建游戏&…

QT属性系统,简单属性功能快速实现 QT属性的简单理解 属性学习如此简单 一文就能读懂QT属性 QT属性最简单的学习

4.4 属性系统 Qt 元对象系统最主要的功能是实现信号和槽机制&#xff0c;当然也有其他功能&#xff0c;就是支持属性系统。有些高级语言通过编译器的 __property 或者 [property] 等关键字实现属性系统&#xff0c;用于提供对成员变量的访问权限&#xff0c;Qt 则通过自己的元对…

回归预测 | Matlab实现GWO-ESN基于灰狼算法优化回声状态网络的多输入单输出回归预测

回归预测 | Matlab实现GWO-ESN基于灰狼算法优化回声状态网络的多输入单输出回归预测 目录 回归预测 | Matlab实现GWO-ESN基于灰狼算法优化回声状态网络的多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-ESN基于灰狼算法优化回声状态…

软件下载网站源码附手机版和图文教程

PHP游戏应用市场APP软件下载平台网站源码手机版 可自行打包APP&#xff0c;带下载统计&#xff0c;带多套模板&#xff0c;带图文教程&#xff0c;可以做软件库&#xff0c;也可以做推广app下载等等&#xff0c;需要的朋友可以下载 源码下载 软件下载网站源码附手机版和图文…

Guava-EventBus 源码解析

EventBus 采用发布订阅者模式的实现方式&#xff0c;它实现了泛化的注册方法以及泛化的方法调用,另外还考虑到了多线程的问题,对多线程使用时做了一些优化&#xff0c;观察者模式都比较熟悉&#xff0c;这里会简单介绍一下&#xff0c;重点介绍的是如何泛化的进行方法的注册以及…

FineReport简单介绍

一、介绍 官网 &#xff1a;FineReport产品简介- FineReport帮助文档 - 全面的报表使用教程和学习资料 报表是以表格、图表的形式来动态展示数据&#xff0c;企业通过报表进行数据分析&#xff0c;进而用于辅助经营管理决策。 FineReport 是一款用于报表制作&#xff0c;分析和…

uniapp中unicloud接入支付宝订阅消息完整教程

经过无数次的尝试,终于还是让我做出来了 准备工作 设置接口加签方式 使用支付宝小程序订阅消息,首先要设置接口加签方式,需要下载支付宝开放平台密钥工具,按照步骤生成秘钥,然后按照支付宝设置密钥加签方式添加接口加签方式。 有一点需要注意的,因为要在云函数中使用,…

Mac M3 Pro安装Hadoop-3.3.6

1、下载Hadoop安装包 可以到官方网站下载&#xff0c;也可以使用网盘下载 官网下载地址&#xff1a;Hadoop官网下载地址 网盘地址&#xff1a;https://pan.baidu.com/s/1p4BXq2mvby2B76lmpiEjnA?pwdr62r提取码: r62r 2、解压并添加环境变量 # 将安装包移动到指定目录 mv …

基于flask的网站如何使用https加密通信-问题记录

文章目录 项目场景&#xff1a;问题1问题描述原因分析解决步骤解决方案 问题2问题描述原因分析解决方案 参考文章 项目场景&#xff1a; 项目场景&#xff1a;基于flask的网站使用https加密通信一文中遇到的问题记录 问题1 问题描述 使用下面的命令生成自签名的SSL/TLS证书和…

大模型基础——从零实现一个Transformer(3)

大模型基础——从零实现一个Transformer(1)-CSDN博客 大模型基础——从零实现一个Transformer(2)-CSDN博客 一、前言 之前两篇文章已经讲了Transformer的Embedding,Tokenizer,Attention,Position Encoding, 本文我们继续了解Transformer中剩下的其他组件. 二、归一化 2.1 L…

红队攻防渗透技术实战流程:中间件安全:JettyJenkinsWeblogicWPS

红队攻防渗透实战 1. 中间件安全1.1 中间件-Jetty-CVE&信息泄漏1.2 中间件-Jenkins-CVE&RCE执行1.2.1 cve_2017_1000353 JDK-1.8.0_291 其他版本失效1.2.2 CVE-2018-10008611.2.3 cve_2019_100300 需要用户帐号密码1.3 中间件-Weblogic-CVE&反序列化&RCE1.4 应…

使用python绘制三维曲线图

使用python绘制三维曲线图 三维曲线图定义特点 效果代码 三维曲线图 三维曲线图&#xff08;3D曲线图&#xff09;是一种用于可视化三维数据的图表&#xff0c;它展示了数据在三个维度&#xff08;X、Y、Z&#xff09;上的变化。 定义 三维曲线图通过在三维坐标系中绘制曲线…

数据结构之线性表(4)

前面我们了解到线性表中的顺序表、链表等结构&#xff0c;今天我们探讨新的一种线性表——栈。 那么我们开始栈的探讨之旅吧。 1.栈的基本概念 1.1栈&#xff08;Stack&#xff09;&#xff1a; 是只允许在一端进行插入或删除的线性表。首先栈是一种线性表&#xff0c;但限定…