目录
方法引用
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用! (
实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!
) 方法引用:使用操作符 “
::
” 将方法名和对象或类的名字分隔开来。
如下三种主要使用情况
:
⚫
对象::实例方法
⚫
类::静态方法
⚫
类::实例方法
再介绍
方法引用:若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用
(可以将方法引用理解为 Lambda 表达式的另外一种表现形式)
1. 对象的引用 :: 实例方法名
2. 类名 :: 静态方法名
3. 类名 :: 实例方法名
注意:
①方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!
②若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: ClassName::MethodName
应用案例
①准备测试类MethodRefTest
package com.csdn.test;
import com.csdn.entity.Employee;
/**
* @author summer
* @date 2022-04-16 10:20
*/
public class MethodRefTest {
Employee employee = new Employee("zhangsan",18,888.0);
}
②测试对象::实例方法的方法引用
在测试类中加入如下测试方法
@Test
public void test1(){
//比如我们需要输出一个字符串
Consumer<String> con1 = str -> System.out.println(str);
con1.accept("helloworld");
//方法引用 对象::实例方法
Consumer<String> con2 = System.out::println;
con2.accept("goodmorning");
}
再比如获取employee对象的姓名或者年龄,我们同样可以使用对象::实例方法来实现,代码如下
@Test
public void test2() {
//获取employee对象的姓名方式一
Supplier<String> s1 = () -> employee.getName();
System.out.println(s1.get());
//获取employee对象姓名方式二,方法引用
Supplier<String> s2 = employee::getName;
System.out.println(s2.get());
//获取employee对象的年龄方式一
Supplier<Integer> s3 = ()->employee.getAge();
System.out.println(s3.get());
//获取employee对象的年龄方式二 方法引用
Supplier<Integer> s4 = employee::getAge;
System.out.println(s4.get());
}
③测试类名::静态方法的方法引用,代码如下
@Test
public void test3(){
//获取两个Double型数据的最大值并返回
// Lambda的做法
BiFunction<Double,Double,Double> fun1 =(x,y)->Math.max(x,y);
System.out.println(fun1.apply(34.5,77.8));
// 类::静态方法的方法引用
BiFunction<Double,Double,Double> fun2 = Math::max;
System.out.println(fun2.apply(90.8,66.4));
}
@Test
public void test4(){
//比较两个int型的大小
// 方式一 ,使用Lambda
Comparator<Integer> com1 = (x,y)->Integer.compare(x,y);
System.out.println(com1.compare(33,44));
// 方式二,使用方法引用
Comparator<Integer> com2 = Integer::compare;
System.out.println(com2.compare(44,33));
}
④测试类名::实例方法的方法引用
@Test
public void test5(){
//比较两个字符串内容是否相同
// 方式一 Lambda
BiPredicate<String,String> pre1 = (x,y)->x.equals(y);
System.out.println(pre1.test("abc","abc"));
// 方式二 方法引用
BiPredicate<String,String> pre2 = String::equals;
System.out.println(pre2.test("abc","obc"));
}
@Test
public void test6(){
//获取传进来的employee对象的姓名
// 方式一Lambda
Function<Employee,String> f1 = e->e.getName();
System.out.println(f1.apply(new Employee("good",12,22.22)));
// 方式二方法引用
Function<Employee,String> f2 = Employee::getName;
System.out.println(f2.apply(new Employee("world",33,33.3)));
}
测试类MethodRefTest 详细代码
package com.csdn.test;
import com.csdn.entity.Employee;
import org.junit.Test;
import java.util.Comparator;
import java.util.function.*;
/**
* @author summer
* @date 2022-04-16 10:20
*/
public class MethodRefTest {
Employee employee = new Employee("zhangsan", 18, 888.0);
@Test
public void test5(){
//比较两个字符串内容是否相同
// 方式一 Lambda
BiPredicate<String,String> pre1 = (x,y)->x.equals(y);
System.out.println(pre1.test("abc","abc"));
// 方式二 方法引用
BiPredicate<String,String> pre2 = String::equals;
System.out.println(pre2.test("abc","obc"));
}
@Test
public void test6(){
//获取传进来的employee对象的姓名
// 方式一Lambda
Function<Employee,String> f1 = e->e.getName();
System.out.println(f1.apply(new Employee("good",12,22.22)));
// 方式二方法引用
Function<Employee,String> f2 = Employee::getName;
System.out.println(f2.apply(new Employee("world",33,33.3)));
}
@Test
public void test3(){
//获取两个Double型数据的最大值并返回
// Lambda的做法
BiFunction<Double,Double,Double> fun1 =(x,y)->Math.max(x,y);
System.out.println(fun1.apply(34.5,77.8));
// 类::静态方法的方法引用
BiFunction<Double,Double,Double> fun2 = Math::max;
System.out.println(fun2.apply(90.8,66.4));
}
@Test
public void test4(){
//比较两个int型的大小
// 方式一 ,使用Lambda
Comparator<Integer> com1 = (x,y)->Integer.compare(x,y);
System.out.println(com1.compare(33,44));
// 方式二,使用方法引用
Comparator<Integer> com2 = Integer::compare;
System.out.println(com2.compare(44,33));
}
@Test
public void test2() {
//获取employee对象的姓名方式一
Supplier<String> s1 = () -> employee.getName();
System.out.println(s1.get());
//获取employee对象姓名方式二,方法引用
Supplier<String> s2 = employee::getName;
System.out.println(s2.get());
//获取employee对象的年龄方式一
Supplier<Integer> s3 = ()->employee.getAge();
System.out.println(s3.get());
//获取employee对象的年龄方式二 方法引用
Supplier<Integer> s4 = employee::getAge;
System.out.println(s4.get());
}
@Test
public void test1() {
//比如我们需要输出一个字符串
Consumer<String> con1 = str -> System.out.println(str);
con1.accept("helloworld");
//方法引用 对象::实例方法
Consumer<String> con2 = System.out::println;
con2.accept("goodmorning");
}
}