lambda表达式与流处理(二)

发布时间 2023-11-07 14:46:15作者: 小粥123456789

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地址