常见的方法引用有那些?
1 静态方法引用。
只要lambda表达式符合(参数)->类名.静态方法(参数) 使用方法引用的方式: 类名::静态方法。
例子: 对整形数组排序。
import java.util.Arrays;
import java.util.Comparator;
public class Test04 {
public static void main(String[] args) {
Integer[] arr={23,345,6,77,7,33,22};
//lambda表达式中有且仅有一条语句,方法的调用。
// Comparator<Integer> comparator=(o1,o2)->Integer.compare(o2,o1);
//使用方法引用的方式
Comparator<Integer> comparator=Integer::compare;
Arrays.sort(arr,comparator);
System.out.println(Arrays.toString(arr));
}
}
运行结果:
2 实例方法引用
他和静态方法引用的唯一区别: 使用对象调用的实例方法。
例子: 创建Student类对象,返回该学生的姓名;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.function.Function;
import java.util.function.Supplier;
public class Test05 {
public static void main(String[] args) {
Student stu=new Student("张三",18);
//反例:
// Function<Student,String> function=st->{return st.getName();};
// Function<Student,String> function=stu::getName;
// Supplier<String> supplier=()->stu.getName();lambda表达式中有且只有一条方法调用的语句。
Supplier<String> supplier=stu::getName;lambda表达式中有且只有一条方法调用的语句。
fun(supplier);
}
//返回学生的姓名
public static void fun(Supplier<String> supplier){
String s = supplier.get();
System.out.println("该学生的姓名:"+s);
}
}
@AllArgsConstructor
@NoArgsConstructor
@Data
class Student{
private String name;
private int age;
}
运行结果:
3 对象方法引用
若Lambda参数列表中的第一个参数是实例方法的参数调用者,而第二个参数是实例方法的参数时,可以使用对象方法引用。
比较字符串是否相同
public static void main(String[] args) {
// BiPredicate<String,String> biPredicate=(s1,s2)->{return s1.equals(s2);};
BiPredicate<String,String> biPredicate=String::equals;
fun2(biPredicate,"hello","world");
}
//判断两个字符串是否相同。
public static void fun2(BiPredicate<String,String> biPredicate,String str1,String str2){
System.out.println(biPredicate.test(str1, str2));
}
运行结果:
4 构造方法引用
注意:需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致。
例子:
public class Test07 {
public static void main(String[] args) {
Supplier<Teacher> supplier=()->new Teacher();
System.out.println("使用lambda表达式:"+supplier.get());
Supplier<Teacher> supplier2=Teacher::new; //必须构造方法的参数和函数式方法的参数要匹配
System.out.println("使用方法引用:"+supplier2.get());
Function<String,Teacher> function=name->new Teacher(name);
System.out.println("使用lambda表达式调用一个参数的构造方法:"+function.apply("张三"));
Function<String,Teacher> function2=Teacher::new;
System.out.println("使用方法引用调用一个参数的构造方法:"+function2.apply("李四"));
//Binary
BiFunction<String,Integer,Teacher> function1=Teacher::new;
System.out.println(function1.apply("张三",55));
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class Teacher{
private String name;
private int age;
public Teacher(String name) {
this.name = name;
}
}
运行结果: