【三】方法引用
方法引用:方法引用可以看做是Lambda表达式的深层表达,也就是函数式接口的实例。
要求:实现接口的抽象方法的参数列表和返回值类型必须与方法引用的方法的参数列表和返回值类型保持一致。
格式:使用操作符“::”将类或对象与方法名分隔开
使用情况:当要传递Lambda表达式体的操作,已经有实现方法,可以使用方法引用。
使用要求:接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型相同。(主要针对于情况一和情况二)
三种主要的使用情况:
- 对象::示例方法名
- 类::静态方法名
- 类::示例方法名
代码示例:
package methodreferences;
import java.io.PrintStream;
import java.util.function.Consumer;
public class MethodReferences1 {
public static void main(String[] args) {
/*Consumer中的------accept(T t)方法
PrintStream中的------println(T t)方法*/
Consumer<String> con=str->System.out.println(str);
con.accept("我爱北京天安门");
System.out.println("--------------------------------");
PrintStream ps=System.out;
Consumer<String> con2=ps::println;
con2.accept("我爱北京天安门");
}
}
示例输出:
【四】构造器引用
要求:实现接口的抽象方法的参数列表必须与构造器引用的方法的参数列表保持一致。
抽象方法的返回值类型就是构造器所属类的类型。
如:R apply(T t)与void Student( String name)参数列表保持一致,因此可以采用构造函数引用
代码示例:
package constructorref;
import java.util.function.Function;
/*
构造器引用:
*/
public class ConstructorRefTest {
public static void main(String[] args) {
//Function<T,R> 函数型接口:对类型为T的对象应用操作,并返回结果R类型的对象。包含方法:R apply(T t);
/*R apply(T t)与void Student( String name)相似,因此可以采用构造函数引用
* 形式:类名::new
* */
Function<String,Student> fun=name->new Student(name);
Student stu=fun.apply("wangerxiao");
System.out.println(stu);
System.out.println("--------------------------------");
Function<String,Student> fun2=Student::new;
Student stu2=fun.apply("zhangsan");
System.out.println(stu2);
}
}
class Student{
private int id;
private String name;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student( String name) {
super();
this.name = name;
}
public Student(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
}
示例输出:
【五】数组引用
类似于构造器引用
代码示例:
package arrayref;
import java.util.Arrays;
import java.util.function.Function;
public class ArrayRefTest {
public static void main(String[] args) {
//Function<T,R> 函数型接口:对类型为T的对象应用操作,并返回结果R类型的对象。包含方法:R apply(T t);
Function<Integer,Double[]> fun=len->new Double[len];
Double[] dou=fun.apply(3);
System.out.println(Arrays.toString(dou));
System.out.println("--------------------------------------");
Function<Integer,Double[]> fun2=Double[]::new;
Double[] dou2=fun.apply(6);
System.out.println(Arrays.toString(dou2));
}
}
示例输出: