语法格式三: 类名::实例方法名
条件:Lambda体中调用方法的参数列表和返回值类型,要与 函数式接口中抽象方法的参数列表和返回值类型保持一致
下面我们对方法引用的三种语法格式,使用代码来看看是如何使用的吧:
这里为了更好看方法引用的语法格式,我们可以创建一个Emp实体类:如下
public class Emp { private Integer id; private String name; public Emp() { } public Emp(Integer id) { this.id = id; } public Emp(String name) { this.name = name; } public Emp(Integer id, String name) { this.id = id; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }接下来我们再使用Emp实体类的对象,通过 对象::实例方法 这种语法格式进行练习
@Test public void test11(){ Emp emp = new Emp(); //使用Lambda表达式实现Supplier接口中的抽象方法 Supplier<String> sup = () -> emp.getName(); String str = sup.get(); System.out.println(str); //使用方法引用代替Lambda表达式进行实现 //注意:这里的getName()的参数列表和返回值类型,和Supplier接口中的get()的参数列表和返回值类型是保持一致的 Supplier<String> sup2 = emp::getName; String name = sup2.get(); System.out.println(name); }语法格式二:类名::静态方法名 的具体应用
@Test public void test12(){ Comparator<Integer> com01 = (x,y) -> Integer.compare(x,y); int compare01 = com01.compare(10, 8); System.out.println("通过Lambda表达式的比较结果为:"+compare01); //类名::静态方法名 Comparator<Integer> com02 = Integer::compare; int compare02 = com02.compare(10, 8); System.out.println("通过方法引用实现的比较结果为:"+compare02); }语法格式三:类名::实例方法名
使用该种语法格式时,必须要注意:若Lambda表达式参数列表中的第一个参数是 实例方法的调用者,而第二个参数是实例方法的参数时,则可以使用ClassName::method。
格式:ClassName::new
注意:需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致
语法格式:数组类型::new
@Test public void test16(){ //Lambda表达式实现 Function<Integer,String[]> fun01 = (x) -> new String[x]; String[] strs = fun01.apply(10); System.out.println(strs.length); //输出结果: 10 //数组引用: 数组类型::new; Function<Integer,String[]> fun02 = String[]::new; String[] strs2 =fun02.apply(20); System.out.println(strs2.length);//输出结果: 20 }