Lambda表达式-方法引用
方法引用
Comparator<Integer> com3 = Integer :: compare;//方法引用
System.out.println(com3.compare(23,21));
方法引用可以看作是基于Lambda表达式的进一步刻画
当满足一定条件的情况下,我们还可以使用方法应用或构造器引用替换Lambda表达式
方法引用的格式
类(或对象):: 方法名
- 情况1:对象 :: 实例方法
函数式接口的抽象方法(重写)a与其内部实现时调用对象的某个方法b的形参列表和返回值类型都相同
可以考虑使用方法b实现对方法a的覆盖。此替换即为方法引用
- 情况2:类 :: 静态方法
函数式接口的抽象方法(重写)a与其内部实现时调用类的某个静态方法方法b的形参列表和返回值类型都相同
可以考虑使用方法b实现对方法a的覆盖。此替换即为方法引用
- 情况3:类 :: 实例方法
函数式接口的抽象方法(重写)a与其内部实现时调用对象的某个方法b的返回值类型相同
同时,抽象方法a中有n个参数,方法b中有n-1个参数,且抽象方法a的第一个参数作为方法b的调用者,后n-1个参数与方法b的n-1个参数相同。可以考虑使用方法b实现对方法a的覆盖。此替换即为方法引用
注:此方法b是非静态方法,本质上还是使用对象调用。但形式上我们写对象a所在的类
构造器引用
类名 :: new
应用案例
Person类
public class Person {
private int id;
private String name;
//有参构造器(只有一个参数)
public Person(int id) {
this.id = id;
}
//有参构造器
public Person(int id, String name) {
this.id = id;
this.name = name;
}
//空参构造器
public Person() {
}
}
案例要求:实例化一个Person类的对象,使用构造器引用
import org.junit.Test;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
public class ConstructorTest {
@Test
public void test() {
//使用供给型接口,有返回值无参数
Supplier<Person> supplier = new Supplier<Person>() {
@Override
public Person get() {
return new Person();
}
};
//方法引用写法
Supplier<Person> supplier1 = Person::new;
}
@Test
public void test2() {
//使用函数式结构,有返回值有参数
Function<Integer, Person> function = new Function<Integer, Person>() {
@Override
public Person apply(Integer integer) {
return new Person(integer);
}
};
//方法引用写法
Function<Integer, Person> function1 = Person::new;
}
@Test
public void test3() {
//使用BiFunction接口,有返回值有两个参数
BiFunction<Integer, String, Person> function = new BiFunction<Integer, String, Person>() {
@Override
public Person apply(Integer integer, String s) {
return new Person(integer, s);
}
};
//方法引用写法
BiFunction<Integer, String, Person> biFunction = Person::new;
}
}
**总结:**无论使用何种构造器,最后的格式不变,因类型推断的缘故,构造器参数看的是泛型类型
数组引用
public void test4() {
//使用函数式结构,有返回值有参数
Function<Integer, Person[]> function = new Function<Integer, Person[]>() {
@Override
public Person[] apply(Integer integer) {
return new Person[integer];
}
};
//方法引用写法
Function<Integer, Person[]> function1 = Person[]::new;
}