Lambda表达式之方法引用

021_方法引用与Lambda表达式 Java 8引入的Lambda表达式和方法引用是简化函数式编程的重要特性。Lambda表达式是匿名函数,用于简化函数式接口的实现,语法为(参数)->{方法体},适用于线程创建、集合排序等场景。方法引用是Lambda的进一步简化,当Lambda仅调用现有方法时使用,包括静态方法引用、实例方法引用和构造器引用等四种类型。两者对比显示,Lambda适合复杂逻辑,方法引用在简单调用时更简洁。这些特性显著减少了代码冗余,提升了开发效率和可读性。 阅读详情

1 学习之前必备知识
1.1 java内置四大核心函数式接口

函数式接口参数类型返回类型内置方法实例代码其他
Consumer< T> 消费型接口Tvoid对类型为T的对象应用操作:void accept(T t)举例①1参数0返回值
Supplier< T>提供型接口无T返回类型为T的对象:T get()举例②0参数1返回值
Function<T, R>函数型接口TR对类型为T的对象应用操作,并返回结果为R类型的对象:R apply(T t)举例③1参数1返回值
Predicate< T>断言型接口Tboolean确定类型为T的对象是否满足某约束,并返回boolean值:boolean test(T t)举例④1参数1返回值
  • 举例①消费型接口
@Test
public void test01(){
    //Consumer<T>
    Consumer<Integer> consumer = (x) -> System.out.println("消费型接口" + x);
    consumer.accept(100);
}
  • 举例②提供型接口
@Test
public void test02(){
    List<Integer> list = new ArrayList<>();
    //Supplier<T>
    Supplier<Integer> supplier = () -> (int)(Math.random() * 10);
    list.add(supplier.get());
    System.out.println(supplier);
    for (Integer integer : list) {
        System.out.println(integer);
    }
}
  • 举例③ 函数型接口
@Test
public void test03(){
    //Function<T, R>
    String oldStr = "abc123456xyz";
    Function<String, String> function = (s) -> s.substring(1, s.length()-1);
    //test
    System.out.println(function.apply(oldStr));
}
  • 举例④断言型接口
@Test
public void test04(){
    //Predicate<T>
    Integer age = 35;
    Predicate<Integer> predicate = (i) -> i >= 35;
    if (predicate.test(age)){
        System.out.println("你该退休了");
    } else {
        System.out.println("我觉得还OK啦");
    }
}

1.1 Java内置四大核心函数式接口的子接口
在这里插入图片描述
2 步入正题,开始Lambda表达式之方法引用的学习介绍
2.1 什么是方法引用以及使用条件

 ①必须是函数式接口,可以写成Lambda表达式的形式
 ②Lambda 表达式体中内容有且仅有一条语句(就是Lambda 表达式体可以去掉{}的情况)
 ③Lambda 表达式体中的一条语句已有方法实现
 ④被引用的方法参数列表和函数式接口中抽象方法的参数一致(除特定方法引用外,见下面例子)
 ⑤接口的抽象方法没有返回值,引用的方法可以有返回值也可以没有
 ⑥接口的抽象方法有返回值,引用的方法必须有相同类型的返回值(除构造器方法引用,数组构造方法引用外,见下面例子)
   则我们可以使用“方法引用”

#例如:
@Test
public void test03(){ 
#Lambda表达式的形式
    BiPredicate<String, String> bp1 = (x, y) -> x.equals(y);//满足以上所有条件;对条件②解释:equals方法已经给我们实现了,我们只是调用而已
    System.out.println(bp1.test("a","b"));
    
#方法引用的形式
    BiPredicate<String, String> bp2 = String::equals;
    System.out.println(bp2.test("c","c"));
}

2.2 语法格式

  • 方法引用是一个Lambda表达式,其中方法引用的操作符是双冒号"::"

2.3不同场景下的语法格式的使用

2.3.1 静态方法引用

  • 类名::方法名
@Test
public void test02(){
    Comparator<Integer> com1 = (x, y) -> Integer.compare(x, y);
    System.out.println(com1.compare(1, 2));

    Comparator<Integer> com2 = Integer::compare;
    System.out.println(com2.compare(2, 1));
}


注意事项(下同):
被引用的方法参数列表和函数式接口中抽象方法的参数一致!!
接口的抽象方法没有返回值,引用的方法可以有返回值也可以没有
接口的抽象方法有返回值,引用的方法必须有相同类型的返回值!!

2.3.2 非静态方法引用

  • 非静态方法的引用包括两种:①对象方法的引用,语法格式:实例::方法名;②特定类型的方法引用,语法格式:类::方法名
    想要明白他们两个怎么区别和什么情况下使用哪一种需要理解一个概念—参数差
    参数差是指函数式接口的参数个数-非静态方法参数个数=0或者1;其中这个参数差取值范围不能变,如果大于1或者小于0都不能用方法引用的任何一种形式,用的话就都会报错。

    • 参数差=0:方法参数个数相等,那么直接通过一个类的实例来调用这个方法即可,因此方法引用就是实例::方法名 即对象方法引用
@Test
public void test01(){
#Lambda表达式的形式
    PrintStream ps = System.out;
    Consumer<String> con1 = (s) -> ps.println(s);
    con1.accept("aaa");  //输出aaa

#方法引用的形式
    Consumer<String> con2 = ps::println;
    con2.accept("bbb");  //输出bbb
}
  • 参数差=1:说明接口有两个参数,非静态方法一个参数,这个时候需要满足第一个参数是非静态方法的调用者,第二个参数是非静态方法的参数(即宿主优先原则),这时候我们用类::方法名 即特定类型的方法引用
@Test
public void test03(){ 
#Lambda表达式的形式
    BiPredicate<String, String> bp1 = (x, y) -> x.equals(y);
    System.out.println(bp1.test("a","b"));
    
#方法引用的形式
    BiPredicate<String, String> bp2 = String::equals;
    System.out.println(bp2.test("c","c"));
}

2.2.3 构造器方法引用

  • 类名::new
@Test
public void test04(){
#lambda表达式形式
    Supplier<List> sup1 = () -> new ArrayList();
    
#方法引用形式
    Supplier<List> sup2 = ArrayList::new;
}

注意:
  需要调用的构造器的参数列表要与函数时接口中抽象方法的参数列表保持一致
  ,我们知道构造器没有返回值,而接口有返回值,所以这种方法引用是一种特例

2.2.4 数组构造方法引用

  • 数据类型[ ]::new
interface test {
    public String[] run(int length);
}
 
public class blog {
    public static void main(String[] args) {
   //实质代码:     test t1 = (length) -> new String[length];
        test t2 = String[]::new;
        String[] arr = t2.run(5);
    }
}

注意:
  需要调用的构造器的参数列表要与函数时接口中抽象方法的参数列表保持一致
  ,我们知道构造器没有返回值,而接口有返回值,所以这种方法引用是一种特例

完结

Lambda表达式的方法引用详解 定义:方法引用(Method Reference)是Lambda表达式的一种简化写法,允许直接通过方法名引用已有的方法。 核心目的:减少冗余代码,提升可读性,尤其在Lambda仅调用一个现有方法时。 阅读详情

相关推荐

Java:Lambda表达式、方法引用

Java:Lambda表达式、方法引用

游手好闲 1393

lambda表达式方法引用

lambda表达式 以及方法引用 lambda表达式 本质是一个函数: 一般的函数类如下: 有返回值,方法名,参数列表,方法体 int add(int a , int b ){ return a+b } lambda表达式的话,只有参数列表,方法体 (参数 列表)->{方法体} ()用来描述参数列表 { } 用来描述方法体 -> 是lambda运算符,箭头运算符 lambda表达式 cal c = (int a, int b) -> {

weixin_69015220的博客 3375

方法引用和lambda表达式的奥妙

下面代码中两处使用了lambda表达式,一个是filter内,一个是forEach内。其中,forEach内的lambda表达式可以被方法引用替代,但是filter内的lambda表达式不能被方法引用替代。 使用方法引用取代的做法: 为什么filter内的lambda表达式不能使用方法引用取代,但是forEach内的lambda表达式可以被方法引用取代呢?这个需要看lambda表达式里面的内容了。在上面案例中,filter内的lambda表达式是写一个对流中元素进行处理的逻辑。而forEach内的lambd

m0_59176231的博客 977

lambda表达式和方法引用

参考: 1 2 什么是lambda表达式 lambda意为λ,表示是一个函数,而一个函数只有唯一的输入输出映射,因此引出lambda表达式的定义 Lambda是一个唯一匿名方法 一个接口,如果只有一个显式声明的抽象方法,那么它就是一个函数式接口。一般用@FunctionalInterface标注出来(也可以不标) 因为该接口有一个抽象方法,在new的时候需要@Override这个抽象方法 格式 什么可以省略? 可推断的都可省略,因此尽可能使用泛型 方框中都可以省略 因为在调用这个方法的

ZJH 1826

控制障碍函数(Control Barrier Function,CBF) 一、定义

介绍控制障碍函数

Lyajpunov的博客 2万+

如何在win11中用双硬盘或移动硬盘装Ubuntu 20.04 双系统

win11 安装双系统

qq_42817360的博客 5138

【Java-API】lambda表达式4种方法引用

首先lambda表达式4种方法引用可以归纳为下列4种: 1,静态方法引用 2,实例方法引用 3,构造方法引用 4,特殊方法引用

m0_64210833的博客 4620

独立站如何采集商品?外贸独立站采集教程

从这里Robert了解到还有国内有很多仿牌卖家、微商,都有类似的情况,他们出海的阻碍主要在于支付、物流、推广。8.插件“抓取任务”列表手动点同步,将商品同步到主商城后台商品管理列表(商品默认同步到下架列表中) 后台商品管理下架列表显示已同步商品。5.店铺信息修改完成后,可以开始采集商品,采集时弹窗中会自动识别当前平台及商品链接,分类和相册名称可以自定义 编辑修改。4. 打开采集目标站商品页面,点开谷歌浏览器扩展程序列表,找到Shopyy采集平台,打开配置页。打开弹窗中的“店铺管理”,添加店铺信息。

Jernnifer_mao的博客 1378

Lambda表达式方法引用

特殊的lambda表达式,它是对lambda表达式的一种简写方式。在Java 8之前只能进行值传递,方法是不能传递的。如果你想调用一个方法你必须先获取到它所在的类的实例,然后再通过实例去调用这个方法,但是Java 8新增了这个新特性可以让你直接把方法当做值来传递。若Lambda体中的内容已经存在对应的方法实现,即存在一个方法,参数列表和返回值于函数是接口一致,方法的实现内容也和Lambda体中的内容相同。则可直接使用方法引用如果我们想要调用的方法拥有一个名字,我们就可以通过它的名字直接调用它。

WanWenQingqijia的博客 758

Twin Builder CFD 示例:构建、验证和评估静态 ROM

通过我们构建、验证和评估静态 ROM 的综合指南,释放 Twin Builder CFD 的潜力。

jkh920184196的博客 1102

获取iOS设备唯一标识UUID(Swift版)

属性返回的UUID是与应用程序相关联的,也就是说,如果用户卸载并重新安装应用程序,该UUID可能会发生变化。如果您需要一个与设备相关的持久唯一标识符,您可以考虑使用Keychain或其他方法来存储和检索设备标识符。在iOS开发中,我们经常需要获取设备的唯一标识符来进行一些特定的操作,比如设备识别、数据追踪等。在本文中,我将向您展示如何使用Swift编程语言获取iOS设备的唯一标识UUID。通过上述代码,您可以在您的iOS应用程序中轻松获取设备的唯一标识符。属性来获取设备的唯一标识UUID。

BitNetO的博客 1918

java笔记(第八部分Lambda表达式与方法引用)

目录一、Lambda表达式 一、Lambda表达式

冰冰凉的博客 523

【25届数字IC秋招总结】面试经验10——紫光同芯

25届数字ic面试记录——紫光同芯

lalala0635的博客 862

【Java】Lambda表达式和方法引用

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

永远相信美好的事情即将发生 1285

基于FPGA的64点fft变换verilog开发

这精度的损失在10bits看来对最后的误差的影响是存在是不可忽略的。此后,在这思想基础上又开发了高基和分裂基等快速算法,随着数字技术的高速发展,1976年出现建立在数论和多项式理论基础上的维诺格勒傅里叶变换算法(WFTA)和素因子傅里叶变换算法。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。

FPGA/MATLAB学习教程/源码/项目合作开发 1977

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Lambda表达式及方法引用

Lambda表达式 在JDK8以前,方法能接收的参数都是变量,JDK8之后,支持将函数作为参数传递。 /** * @Description: 接口 */ @FunctionalInterface public interface Simple { void callback(); } JDK8之前 /** * @Description: 客户端测试 */ public class Cl...

程序员小潘 4851

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

@FunctionalInterface、Lambda表达式和方法引用

小插曲:Callable和Runnable到底什么区别?这两者也都是JDK预定义的函数接口,两者都不接收参数,主要用于多线程编程。Runnable无返回值,一般用于new一个新线程的时候,在新线程中执行代码。Callable一样一般用于在新线程中执行,只不过执行成功后有返回值,如果执行失败还会抛异常。最后,一起分析:c1引用了一个Lambda表达式;c2引用了一个新的Lambda表达式,表示式的实现代码中调用了c1提供的call()方法,并将call()方法的返回值返回。

zzhongcy的专栏 1578

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java Lambda表达式及方法引用

LambdaLambda表达式是Java SE 8中一个重要的新特性。允许你通过表达式来代替功能接口,其几乎解决了匿名内部类带来的所有问题。 其实Lambda表达式的本质是一个”语法糖”,由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。

一个博客 3801

Java Lambda表达式与方法引用详解

Lambda表达式控制流与作用域规则摘要 控制流语句规则: Lambda内break/continue仅作用于内部循环,return仅退出Lambda本身 禁止非局部跳转,如用break跳出包含Lambda的外层循环 throw抛出的异常需与函数式接口声明兼容 作用域特性: 采用词法作用域,共享外围环境变量 this指向外围类实例,与匿名类不同 可访问final/等效final局部变量,禁止重定义外围变量 典型限制: Lambda参数不能与外层变量同名 不能修改捕获的局部变量 实例变量通过this访问,静态

静水深流 1495

lambda表达式与方法引用

匿名内部类的本质 重写父类或实现接口的子类对象 案例 package Test05; /*匿名内部类:重写父类或实现接口的子类对象*/ interface show{ void show1(); void show2(); } public class Test01 { public static void main(String[] args) { test(new show() { @Override public

m0_46205209的博客 509

Java方法引用(Method References):什么是方法引用?如何与Lambda表达式结合使用?

在Java 8中,除了Lambda表达式,方法引用(Method References)也是一项重要的特性。方法引用是一种简洁的语法糖,可以让你在代码中直接引用已有方法,与Lambda表达式结合使用,代码更加清晰简洁。本篇文章中,猫头虎将详细解析: 什么是方法引用? 方法引用的四种类型 如何与Lambda表达式结合使用? 掌握方法引用,让你的代码更加优雅,简化Lambda写法!

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 3077

Lambda表达式和方法引用浅析

之前说了,Lambda表达式就是函数式接口实例 方法引用其实就是Lambda表达式的另一个写法,所以方法引用也就是函数式接口实例 来看几个Lambda表达式和方法引用的例子 对象::实例方法 @Test public void test() { List<Integer> list = new ArrayList<>(); li...

shijiujiu33的博客 725

Java,Lambda表达式、方法引用和构造器引用

>的左边:lambda形参列表,参数的类型都可以省略。如果形参只有一个,则括号( )也可以省略。->的右边:lambda体,对应着重写的方法体。当方法体只有一条语句时,大括号{}可以省略。如果只有一条return语句,则大括号{}和return一并省略。

二狗mao的博客 1334

Lambda表达式 与 方法引用

Lambda表达式 Lambda 表达式是使用最小可能语法编写的函数定义: Lambda 表达式产生函数,而不是类。 在 JVM(Java Virtual Machine,Java 虚拟机)上,一切都是一个类,因此在幕后执行各种操作使 Lambda 看起来像函数 —— 但作为程序员,你可以高兴地假装它们“只是函数”。 Lambda 语法尽可能少,这正是为了使 Lambda 易于编写和使用。 我们在 Strategize.java 中看到了一个 Lambda 表达式,但还有其他语法变体: // f

Mr_moving 525
上一篇: Lambda表达式之入门基础
下一篇: 已知文件的URL,打包压缩下载文件
jothan_lee
博客等级 码龄9年 30粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值