引用
方法引用
方法引用是使用“::”将方法名和对象或类分隔,若lambda体中的内容有方法已经实现,我们可以使用“方法引用”,主要分为三种情况。
对象::实例方法名
注意:lambda体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的参数列表和返回类型保持一致。
public void test1(){
User user = new User();
user.setName("小明");
//方法引用前
Supplier<String> sup = () -> user.getName();
System.out.println(sup.get());
//方法引用后
Supplier<String> sup1 = user :: getName;
System.out.println(sup1.get());
}
类::静态方法名
@Test
public void test2(){
//方法引用前
Comparator<Integer> com = (x,y) -> Integer.compare(x, y);;
System.out.println(com.compare(1, 2));
//方法引用后
Comparator<Integer> com1 = Integer::compare;
System.out.println(com1.compare(1, 2));
}
类::实例方法名
若lambda参数列表中的第一参数是实例方法的调用者,而第二个参数是实例方法参数时,可以使用ClassName::method。
@Test
public void test3(){
//方法引用前
BiPredicate<String, String> bp = (x,y) -> x.endsWith(y);
System.out.println(bp.test("1", "2"));
//方法引用后
BiPredicate<String, String> bp1 = String::equals;
System.out.println(bp1.test("1", "2"));
}
构造器引用
public void test4(){
//方法引用前
Supplier<User> sup = () -> new User();
User u = sup1.get();
System.out.println(u.toString());
//方法引用后
Supplier<User> sup1 = User::new;//调用的为无参构造器
User u1 = sup1.get();
System.out.println(u1.toString());
}
数组引用
public void test5(){
//方法引用前
Function<Integer, String[]> fn = (x) -> new String[x];
String[] str = fn.apply(10);
System.out.println(str.length);
//方法引用后
Function<Integer, String[]> fn1 = String[]::new;
String[] str1 = fn1.apply(20);
System.out.println(str1.length);
}