他和静态方法引用的唯一区别: 使用对象调用的实例方法。
package demo01;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.function.Supplier;
/**
* @program: jdk8-02
* @description:
* @author: 阿木
* @create: 2022-02-15 08:46
**/
public class Test01 {
public static void main(String[] args) {
Student s=new Student("张三",18);
//使用供给型函数接口T get();
Supplier<String> supplier=()->s.getName();
System.out.println(supplier.get());
//(args)->对象名.实例方法(args); --- 对象::实例方法
Supplier<String> supplier1=s::getName;
System.out.println(supplier1.get());
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class Student{
private String name;
private Integer age;
}
对象方法引用
若Lambda参数列表中的第一个参数是实例方法的参数调用者,而第二个参数是实例方法的参数时,可以使用对象方法引用。
package demo02;
import java.util.function.BiPredicate;
/**
* @program: jdk8-02
* @description:
* @author: 阿木
* @create: 2022-02-15 08:52
**/
public class Test02 {
public static void main(String[] args) {
BiPredicate<String,String> predicate=(t1,t2)->t1.equals(t2);
System.out.println(predicate.test("hello", "Hello"));
//(arg1,arg2)-->agr1.实例方法(arg2);----- 类名::实例方法。
BiPredicate<String,String> predicate1=String::equals;
System.out.println(predicate1.test("hello","hello"));
}
}
构造方法引用
注意:需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致。
package demo03;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.function.BiFunction;
import java.util.function.Supplier;
/**
* @program: jdk8-02
* @description:
* @author: 阿木
* @create: 2022-02-15 09:04
**/
public class Test03 {
public static void main(String[] args) {
Supplier<Student> supplier=()->new Student();
System.out.println(supplier.get());
//符合构造方法引用
Supplier<Student> supplier1=Student::new;
System.out.println(supplier1.get());
BiFunction<String,Integer,Student> function=( t, u)->new Student(t,u);
System.out.println(function.apply("张三",20));
BiFunction<String,Integer,Student> function1=Student::new;
System.out.println(function1.apply("李四",19));
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class Student{
private String name;
private Integer age;
}