Java20:新特性

一:Lambda表达式:

1. Lambda表达式使用前后对比:

举类一:

 @Testpublic void test(){
Runnable r1 = new Runnable() {@Overridepublic void run() {System.out.println("我爱北京天安门!");}
};r1.run();System.out.println("******************************");//lambda表达式的写法Runnable r2=()->System.out.println("我爱北京天安门!");r2.run();}

举类二:

@Test
public void test2(){Comparator<Integer> com = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return Integer.compare(o1,o2);}};int compare = com.compare(12, 15);System.out.println(compare);System.out.println("******************************");//lambda表达式的写法Comparator<Integer> com2= (o1,o2)->Integer.compare(o1,o2);int compare1 = com2.compare(21, 15);System.out.println(compare1);}
2.lambda表达式的基本语法

1.举类:(o1,o2)->Integer.compare(o1,o2);

2.格式:

       》lambda操作符或 箭头操作符

       》左边:lambda形参列表(其实就是接口的抽象方法的形参列表)

       》右边:lambda体(其实就是重写的抽象方法的方法体)

3.如何使用:分为六种情况:
//语法格式一:无参,无返回值
Runnable r1 =()-> {System.out.println("hello lambda");};
//语法格式二:一个参数,但是没有返回值
Consumer<String> con=(String str)-> {System.out.println(str);};
//语法格式三:数据类型可以省略,因为可由编译器推断出,称为“类型推断”
Consumer<String> con2=(str)-> {System.out.println(str);};
//语法格式四:只有一个参数时,参数的小括号可以省略
Consumer<String> con3=str-> {System.out.println(str);};
//语法格式五:需要两个或以上参数,多条执行语句,并且可以由返回值
Comparator<Integer> com =(o1,o2)->{System.out.println("实现函数式接口方法!");return Integer.compare(o1,o2);
};
//语法格式六:当lambda体只有一条执行语句时,return与大括号若有,都可以省略
Comparator<Integer> com2 =(o1,o2)->Integer.compare(o1,o2);
4.总结六种情况:

》左边:lambda形参列表的参数类型可以省略(类型推断):如果lambda形参列表

只一个参数,其一对()也可以省略

》右边:lambda 体应该使用一对{}包裹;如果lambda体只一条执行语句(可能是return语句,省略这一对{}和return关键字)

二:函数式接口:

1.函数式接口的使用说明

》如果一个接口中,只声明一个抽象方法,则此接口就称为函数式接口。我们可以

》在一个接口上使用@FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。

》lambda表达式的本质:作为函数式接口的实例

2.java8中关于lambda表达式提供的4个基本的函数式接口:

具体使用:

3.总结:

3.1何时使用lambda表达式?

当需要对一个函数式接口实例化的时候,可以使用lambda表达式。

3.2 何时 使用给定的函数式接口?

如果我们开发中需要定义一个函数式接口,首先看看在已有的jdk提供的函数式接口是否提供了

能满足需求的函数式接口。如果有则直接调用即可,不需要自己再定义了。

三:方法引用:

1.理解:

方法引用可以看做式lambda表达式深层次的表达,换句话说,方法引用就是lambda表达式,

也就是函数式接口的一个实例:通过方法的名字来指向一个方法。

2.使用情境:

当要传递给lambda体的操作,已经有实现的方法了,可以使用方法引用。

3.格式:

类(或对象)::方法名

4.分为如下的三种情况:

情况1:对象::非静态方法

情况 2:类:静态方法

情况3:类:非静态方法

5.要求:

要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型相同!(针对情况1和情况2)

当函数式接口方法的第一个参数是需要引用方法的调用者,并且第二个参数是需要引用方法的参数(或无参数时)Classname::MethodName(针对情况3)

6.使用建议:

如果给函数式接口提供实例,恰好满足方法引用的使用情景,大家可以考虑使用方法引用给函数式接口提供实例。如果不熟悉方法引用,可以使用lambda 表达式

7.使用举类:
@Test
public void test4() {Consumer<String> con= s-> System.out.println(s);con.accept("北京欢迎你!");System.out.println("****************");PrintStream ps= System.out;//方法引用1:对象::非静态方法名Consumer<String> con2=ps::println;con2.accept("北京欢迎你2!");
}
@Test
public void test5(){Function<Double,Long> fun1 =d->Math.round(d);System.out.println(fun1.apply(14.2));System.out.println("****************");//方法引用2:类::静态方法名Function<Double,Long> fun2=Math::round;System.out.println(fun2.apply(14.6));
}
@Test
public void test6(){Person per =new Person(20,"tom");Function<Person ,String> f1=p->p.getName();System.out.println(f1.apply(per));System.out.println("****************");//方法引用3:类::非静态方法名Function<Person ,String> f2=Person::getName;System.out.println(f2.apply(per));}

四:Stream API:

1.Stream API 的理解:

》stream 关注的 是对数据的运算,与CPU打交道,集合关注的是数据的存储,与内存打交道

》java 8提供了一套api,使用这套api可以对内存中的数据进行过滤,排序,映射,归约等操作

2.注意点:

》stream 自己不会存储元素

》stream 不会改变源对象。相反,他们会返回一个持有结果的新stream

》stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行

3.stream 的使用流程:

1)stream的实例化

2)一系列的中间操作(过滤,映射....)

3)终止操作

4.使用流程的注意点:

》一个中间操作链,对数据源的数据进行处理

》一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会在被使用

5.stream实例化
@Test
public void test7(){//实例化方式一:调用集合的stream()List<Employee> employees = EmploeeData.ListEmployees();Stream<Employee> stream = employees.stream();System.out.println(stream);//实例化方式二:调用数组的静态stream()
Integer[] arr= new Integer[]{1,2,3,4,5,6,7,8,9,10};Stream<Integer> stream1 = Arrays.stream(arr);System.out.println(stream1);//实例化方式三:调用类Stream的of()方法Stream<Integer> stream2 = Stream.of(arr);System.out.println(stream2);//实例化方式四:Stream类的迭代器和生成器//迭代器,生成十个偶数Stream.iterate(0,t->t+2).limit(10).forEach(System.out::println);//生成器,生成十个随机数Stream.generate(Math::random).limit(10).forEach(System.out::println);}
6.中间操作和终止操作
    public void test8(){//中间操作:Stream<Employee> stream = EmploeeData.ListEmployees().stream();// filter(P):过滤器:过滤年龄大于30的员工stream.filter(e->e.getAge()>30).forEach(System.out::println);System.out.println("*****************");// limit(int n):显示前几条数据EmploeeData.ListEmployees().stream().limit(3).forEach(System.out::println);System.out.println("*****************");//skip(int n):跳过 前n条数据,显示剩余数据,如果跳过数据大于集合数据,返回空的streamEmploeeData.ListEmployees().stream().skip(4).forEach(System.out::println);System.out.println("*****************");//map(Functional f):返回映射后的stream,并输出EmploeeData.ListEmployees().stream().map(e->e.getName()).forEach(System.out::println);System.out.println("*****************");//sorted():排序Arrays.asList(1,2,8,5,-1,23,6).stream().sorted().forEach(System.out::println);//sorted(Comparator com):定制排序EmploeeData.ListEmployees().stream().sorted((e1,e2)->Double.compare(e1.getSalary(),e2.getSalary())).forEach(System.out::println);//终止操作:// allMatch():判断是否都符合boolean allMatch = EmploeeData.ListEmployees().stream().limit(5).allMatch(e -> e.getAge() > 20);System.out.println(allMatch);//max():求最大值Optional<Integer> max = EmploeeData.ListEmployees().stream().map(e -> e.getAge()).max(Integer::compareTo);System.out.println(max);//forEeach():迭代.Arrays.asList(1,2,8,5,-1,23,6).stream().forEach(System.out::println);//reduce():归约Integer reduce = Arrays.asList(1, 2, 8, 5, -1, 23, 6).stream().sorted().reduce(0, Integer::sum);System.out.println(reduce);//collect():收集,把stream结果集转换为list或setList<String> collectList = EmploeeData.ListEmployees().stream().map(e -> e.getName()).collect(Collectors.toList());Iterator<String> iterator = collectList.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}}
}

五:Optional

1.理解:为了解决java中的空指针问题而生

Optional<T>类(java.util.Optional)是一个容器类,它可以保存类的值,

代表这个值存在,或者仅仅报错null,表示这个值不存在,原来用null 表示一个值不存在,

现在Optional可以更好的表达这个概念,并且可以避免空指针

2.常用方法:
@Test
public void test9(){String str="hello";//str=null;//1.of(T t):创建value为T类型的Optional类,且t不能为nullOptional<String> op1 = Optional.of(str);//of()和get()搭配使用,获取内部封装的数据System.out.println(op1.get());System.out.println("******************");//2.ofNullable(T t)创建value为T类型的Optional类,且可以为nullstr=null;//ofNullable()和orElse()搭配使用,获取内部封装的数据Optional<String> op2 = Optional.ofNullable(str);//如果Op2的value为null,则str2的值为"beijing"String str2 = op2.orElse("beijing");System.out.println(str2);}
3.典型练习:
class Boy{private Girl girl;public Girl getGirl() {return girl;}public void setGirl(Girl girl) {this.girl = girl;}public Boy(Girl girl) {this.girl = girl;}public Boy() {}
}class Girl{private String name;public Girl(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
       // Optional 之前用法public String getGirlName(Boy boy){if(boy!=null){Girl girl = boy.getGirl();if(girl!=null){return  girl.getName();}return null;}return null;}@Testpublic void test10(){String girlName = getGirlName(new Boy());System.out.println(girlName);System.out.println();Boy boy = new Boy(new Girl("陈德容"));String girlName1 = getGirlName(boy);System.out.println(girlName1);}// Optional 实现public String getGirlName2(Boy boy){Optional<Boy> boyoptional = Optional.ofNullable(boy);//boy1 一定非空Boy boy1 = boyoptional.orElse(new Boy(new Girl("迪丽热巴")));Girl girl = boy1.getGirl();Optional<Girl> girl1 = Optional.ofNullable(girl);//girl2 一定非空Girl girl2 = girl1.orElse(new Girl("古力娜扎"));String name = girl2.getName();return name;}@Testpublic void test11() {Boy boy =new Boy(new Girl("lily"));boy=null;String name2 = getGirlName2(boy);System.out.println(name2);}}

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

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

相关文章

基于SSM的协同过滤技术的网上书城(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的协同过滤技术的网上书城&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Sp…

手撕spring bean的加载过程

这里我们采用手撕源码的方式&#xff0c;开始探索spring boot源码中最有意思的部分-bean的生命周期&#xff0c;也可以通过其中的原理理解很多面试以及工作中偶发遇到的问题。 springboot基于约定大于配置的思想对spring进行优化&#xff0c;使得这个框架变得更加轻量化&#…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Radio组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Radio组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Radio组件 单选框&#xff0c;提供相应的用户交互选择项。 子组件 无。 接口 …

第十五篇【传奇开心果系列】Python的OpenCV库技术点案例示例:图像配准

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例系列短博文目录前言一、常见的图像配准任务介绍二、图像配准任务:图像拼接介绍和示例代码三、图像配准任务:图像校正介绍和示例代码四、图像配准任务:图像配准介绍和示例代码五、基于特征点的配准方法介绍…

面试150 颠倒二进制位 位运算分治 逻辑右移

Problem: 190. 颠倒二进制位 文章目录 思路复杂度位运算分治法 思路 &#x1f468;‍&#x1f3eb; 参考题解 >>>&#xff1a;逻辑右移&#xff08;符号位一起移动&#xff0c;高位补零&#xff09; 复杂度 时间复杂度: O ( log ⁡ n ) O(\log{n}) O(logn) 空间…

Nacos1.X源码解读(待完善)

下载源码 1. 克隆git地址到本地 # 下载nacos源码 git clone https://github.com/alibaba/nacos.git 2. 切换分支到1.4.7, maven编译(3.5.1) 3. 找到启动类com.alibaba.nacos.Nacos 4. 启动VM参数设置单机模式, RUN 启动类 -Dnacos.standalonetrue 5. 启动本地服务注册到本…

3、生成式 AI 如何帮助您改进数据可视化图表

生成式 AI 如何帮助您改进数据可视化图表 使用生成式 AI 加速和增强数据可视化。 图像来源:DALLE 3 5 个关键要点: 数据可视化图表的基本结构使用 Python Altair 构建数据可视化图表使用 GitHub Copilot 加快图表生成速度使用 ChatGPT 为您的图表生成相关内容使用 DALL-E 将…

elementPlus实现动态表格单元格合并span-method方法总结

最近在做PC端需求的时候&#xff0c;需要把首列中相邻的同名称单元格合并。 我看了一下elementPlus官网中的table表格&#xff0c;span-method可以实现单元格合并。 我们先看一下官网的例子&#xff1a; 合并行或列 多行或多列共用一个数据时&#xff0c;可以合并行或列。 …

IDEA生成可执行jar包

1. 进入需要打包的项目&#xff0c;选择 最上方菜单栏的 File → Project Structure 2. 选择 左侧菜单栏 Artifacts → 加号 → JAR → from modules with dependencies 3. 选择入口类 Main Class&#xff08;点击文件夹图标可以快速选择&#xff09;&#xff0c;点击 OK&#…

go语言每日一练——链表篇(六)

传送门 牛客面试必刷101题—— 判断链表中是否有环 牛客面试必刷101题—— 链表中环的入口结点 题目及解析 题目一 代码 package mainimport . "nc_tools"/** type ListNode struct{* Val int* Next *ListNode* }*//**** param head ListNode类* return bool…

[Python] scikit-learn中数据集模块介绍和使用案例

sklearn.datasets模块介绍 在scikit-learn中&#xff0c;可以使用sklearn.datasets模块中的函数来构建数据集。这个模块提供了用于加载和生成数据集的函数。 API Reference — scikit-learn 1.4.0 documentation 以下是一些常用的sklearn.datasets模块中的函数 load_iris() …

Prompt Engineering实战-构建“哄哄模拟器”

目录 一 背景 二 “哄哄模拟器”的Prompt Prompt 的典型构成 三 操作步骤 3.1 创建对话 3.2 游戏测试 一 背景 前几天《AI 大模型全栈工程师》第二节课讲了“Prompt Engineering&#xff0c;提示工程”&#xff0c;里面提到一些prompt相关的技巧&#xff0c;原则&#xf…

标准库 STM32+EC11编码器+I2C ssd1306多级菜单例程

标准库 STM32EC11编码器I2C ssd1306多级菜单例程 &#x1f4cc;原创项目来源于&#xff1a;https://github.com/AdamLoong/Embedded_Menu_Simple&#x1f4cd;相关功能演示观看&#xff1a;https://space.bilibili.com/74495335 单片机多级菜单v1.2 &#x1f449;本次采用的是原…

配置Jenkins自动构建打包项目

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 需求说明 1、给A项目配置jenkins每2小时无条件自动构建一次&#xff0c;无论是否有代码提交。 2、给B项目配置jenkins每15分钟检…

论文阅读-通过云特征增强的深度学习预测云工作负载转折点

论文名称&#xff1a;Cloud Workload Turning Points Prediction via Cloud Feature-Enhanced Deep Learning 摘要 云工作负载转折点要么是代表工作负载压力的局部峰值点&#xff0c;要么是代表资源浪费的局部谷值点。预测这些关键点对于向系统管理者发出警告、采取预防措施以…

ubuntu开机报错/dev/nume0n1p2:clean

一、前提 1、当你平时用的图站或者linux系统出现这个问题&#xff0c;首先看看你的显卡有没有换位置。 我的就是项目电脑&#xff0c;同事换了显卡位置&#xff0c;我不知道&#xff0c;当我在这个基础上继续做的时候&#xff0c;出了问题。 2、当你是第一次装显卡&#xff…

[office] 在Excel中怎么给单元格文本创建超链接- #职场发展#笔记

在Excel中怎么给单元格文本创建超链接? 有时候我们想在excel中通过点击提示文字直接打开文件或找到某文件所在位置&#xff0c;这就要用到超链接&#xff0c;那么在Excel中怎么给单元格文本创建超链接?下面小编就为大家详细介绍一下&#xff0c;一起&#xff0c;来看看吧 时…

shell脚本基础语法(.sh ./ sh bash source shell)

Linux 之 Shell 脚本基础语法 0. 学习一门语言的顺序 1. Shell 编程概述 1.1 Shell 名词解释 在 Linux 操作系统中&#xff0c;Shell 是一个命令行解释器&#xff0c;它为用户提供了一个与操作系统内核交互的界面。用户可以通过 Shell 输入命令&#xff0c;然后 Shell 将这些…

gcore服务器设置root账号密码登录

这个厂商很奇怪&#xff0c;默认只能用centos用户与公钥登录&#xff0c;但是这样有时候很麻烦。 他默认开启了SELinux&#xff0c;和强制ssh密钥登录。 下面所有操作在root模式下进行 SELinux设置为兼容模式 setenforce 0vi /etc/selinux/config然后将文件中的SELINUXenfo…

Doris中的本地routineload环境,用于开发回归测试用例

----------------2024-2-6-更新-------------- doris的routineload&#xff0c;就是从kafka中加载数据到表&#xff0c;特点是定时、周期性的从kafka取数据。 要想在本地开发测试routine load相关功能&#xff0c;需要配置kafka环境&#xff0c;尤其是需要增加routine load回…