lambda表达式与流处理(二)
14.2 方法的引用
1.lambda表达式还添加了一类新语法,用来引用方法,也就是说方法也可以作为一个对象被调用。根据不同的方法类型,方法的引用包括引用静态方法、引用成员方法和引用构造方法等。
14.2.1 引用静态方法
引用静态方法的语法如下:
类名::静态方法名
【例14.7】使用lambda表达式引用静态方法
从这个结果可以看出,接口方法得出的结果正是按照add()方法中的逻辑计算出来的。
14.2.2 引用成员方法
【例14.8】使用lambda表达式引用成员方法
创建函数式接口和测试类,在接口中定义抽象方法method(),在测试类中编写一个可以用来实现抽象方法的成员方法——format()方法。在main()方法中创建接口对象,并使用引用成员方法的语法让接口对象的抽象方法按照测试类的format()方法来实现。
14.2.3 引用带泛型的方法
泛型是Java开发经常使用到的功能,“::”操作符支持引用带泛型的方法。除方法外,“::”操作符也支持引用带泛型的类。
【例14.9】使用lambda表达式引用带泛型的方法
注意:
与其他使用泛型的场景一样,要保证代码前后泛型一致,否则会发生编译错误。
14.2.4 引用构造方法
lambda表达式有3种引用构造方法的语法,分别是引用无参构造方法、引用有参构造方法和引用数组构造方法。
引用构造方法的语法如下:
类名::new
这个语法有一点要注意:new关键字之后没有圆括号,也没有参数的定义。如果类中既有无参构造方法,又有有参构造方法,使用引用构造方法语法后,究竟哪一个构造方法被引用了呢?引用哪个构造方法是由函数式接口决定的,“::”操作符会返回与抽象方法的参数结构相同的构造方法。如果找不到参数接口相同的构造方法,则会发生编译错误。
【例14.10】使用lambda表达式引用无参构造方法
从这个结果可以看出,如果接口方法没有参数,调用的就是无参的构造方法。
2.引用有参构造方法
从这个结果可以看出,无参构造方法没有被调用,接口方法使用的就是有参数的构造方法。
3.引用数组构造方法
Java开发可能出现这样一种特殊场景:把数组类型当作泛型。如果方法返回值是泛型,在这种特殊场景下,方法就应该返回一个数组类型的结果。如果要求抽象方法既引用构造方法,又要返回数组类型结果,这种场景下抽象方法的参数就有了另外一个含义:数组个数。抽象方法的参数可以决定返回的数组长度,但数组中的元素并不是有值的,还需要再次赋值。引用数组构造方法的语法也会有所不同,语法如下:
类名[]::new
实例中不能给array[3]赋值,因为接口方法的参数是3,创建的数组只包含3个元素。
14.2.5 Fuction接口
在此之前的所有实例中,想要使用lambda表达式都需要先创建或调用已有的函数式接口,但java.util.function包已经提供了很多预定义函数式接口,就是没有实现任何功能,仅用来封装lambda表达式的对象。该包中最常用的接口是Function<T,R>接口,这个接口有以下两个泛型:
T:被操作的类型,可以理解为方法参数类型。
R:操作结果类型,可以理解为方法的返回类型。
Function接口是函数式接口,所以只有一个抽象方法,但是Function接口还提供了3个已实现的方法以方便开发者对函数逻辑进行更深层的处理。Function接口方法如表14.1所示。
【例14.13】使用lambda表达式拼接IP地址
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南