一、使用时机
- 需要实现接口的方法,并且没有现成的方案——使用lambda
- 需要实现接口的方法,并且已经有了现成的方案——使用方法引用
二、使用条件
Lambda
- 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。 无论是JDK内置的 Runnable 、 Comparator 接口还是自定义的接口,只有当接口中的抽象方法存在且唯一 时,才可以使用Lambda。
- 使用Lambda必须具有上下文推断。 也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
备注:有且仅有一个抽象方法的接口,称为“函数式接口”。
摘自:https://www.cnblogs.com/King-boy/p/11256734.html方法引用
- 在Lambda的条件基础上,实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致。
三、书写格式
lambda
- (参数1,参数2…)-> {【代码块】}
- ()-> 【单行代码】
方法引用
- 对象名::实现方法(非静态)
- 类::静态方法名
- 类::实例方法(非静态)
四、demo
import org.junit.Test;
import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Supplier;
/**
* 测试Lambda与方法引用
* @Author Zing_Lee
* @Date 2021/12/8 17:28
*/
public class LambdaTest {
@Test
public void test01(){
//使用lambda代替接口的方法体
Student stu = new Student("张三",123);
Supplier<String> sp = ()->stu.getName();
System.out.println(sp.get());
//使用方法引用代替接口的方法
Supplier<String> sp2 = stu::getName;
System.out.println(sp2.get());
}
@Test
public void test02(){
//使用lambda比较两个整型的大小
Comparator<Integer> cpr = (x,y)->Integer.compare(x,y);
System.out.println(cpr.compare(10,12));
//使用方法引用比较两个整型的大小
Comparator<Integer> cpr2 = Integer::compare;
System.out.println(cpr2.compare(10,12));
}
@Test
public void test03(){
//使用lambda表达式比较两个字符串
BiPredicate<String,String> bp1 = (x,y)->x.equals(y);
System.out.println(bp1.test("12a","12a"));
//使用方法引用比较两个字符串
BiPredicate<String,String> bp2 = String::equals;
System.out.println(bp2.test("12a","12a"));
}
}