方法引用
简介
方法引用就是Lambda 表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法。当要传递给 Lambda 体的操作,已经有实现的方法了,可以使用方法引用。
方法引用格式
1.对象 :: 实例方法名
2.类 :: 静态方法名
3.类 :: 实例方法名
方法引用使用前提
总体要求:Lambda 体只有一句语句,并且是通过调用一个对象的/类现有的方法来完成的
引用格式1要求:函数式接口中的抽象方法由类的实例方法实现,且两个方法的参数和返回值相同
引用格式2要求:函数式接口中的抽象方法由类的静态方法实现,且两个方法的参数和返回值相同
引用格式3要求:函数式接口中的抽象方法由类的实例方法实现,抽象方法与实例方法返回值相同,抽象方法的参数比实例方法多一个,且抽象方法的第一个参数是实例方法的调用者
代码示例
引用格式1
@Test
public void test1(){
Consumer<String> consumer1 = s -> System.out.println(s);
consumer1.accept("hello world");
Consumer<String> consumer2 = System.out::println;
consumer1.accept("hello world");
}
引用格式2
@Test
public void test2(){
Function<Double,Long> function1 = num -> Math.round(num);
System.out.println(function1.apply(3.14));
Function<Double,Long> function2 = Math::round;
System.out.println(function2.apply(6.28));
}
引用格式3
@Test
public void test3(){
Function<String,Integer> function1 = str -> str.length();
System.out.println(function1.apply("hello world"));
Function<String,Integer> function2 = String::length;
System.out.println(function2.apply("hello world"));
}
构造器引用
简介
当 Lambda 表达式是创建一个对象,并且满足 Lambda 表达式形参,正好是给创建这个对象的构造器的实参列表,就可以使用构造器引用。
引用格式
类::new
代码示例
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Person {
private String name;
private Integer age;
public Person(String name) {
this.name = name;
}
}
@Test
public void test4(){
Supplier<Person> supplier = Person::new;
System.out.println(supplier.get());
Function<String,Person> function = Person::new;
System.out.println(function.apply("www"));
BiFunction<String,Integer,Person> biFunction = Person::new;
System.out.println(biFunction.apply("www", 18));
}
根据参数的不同,选择不同的构造器