Lambda表达式学习笔记 (2)

语法格式三: 类名::实例方法名
条件:Lambda体中调用方法的参数列表和返回值类型,要与 函数式接口中抽象方法的参数列表和返回值类型保持一致
下面我们对方法引用的三种语法格式,使用代码来看看是如何使用的吧:

//对象::实例方法 @Test public void test10(){ //使用Lambda表达式实现接口中的抽象方法 Consumer<String> con = (x) -> System.out.println(x); con.accept("abcdef"); //使用 方法引用 的形式,实现接口中的抽象方法 //这里的 System.out 实际上是PrintStream的类型的匿名对象 //System.out::println; 也可以写成 PrintStream ps1 = System.out; ps1::println; Consumer<String> con2 = System.out::println; con2.accept("abcdef"); }

这里为了更好看方法引用的语法格式,我们可以创建一个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。

@Test public void test13(){ BiPredicate<String,String> bp01 = (x,y) -> x.equals(y); boolean test01 = bp01.test("hello", "hello"); System.out.println("通过Lambda表达式的比较结果为:"+test01);//输出结果:通过Lambda表达式的比较结果为:true BiPredicate<String,String> bp02 = String::equals; boolean test02 = bp02.test("hello", "hello"); System.out.println("通过方法引用实现的比较结果为:"+test02); //输出结果:通过方法引用实现的比较结果为:true } 构造器引用

格式:ClassName::new
注意:需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致

@Test public void test14(){ Supplier<Emp> sup = () -> new Emp(); //构造器引用方式 //调用的是无参构造:由于需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致,这里供给型结构Supplier中的get()是没有参数列表,所以调用的是无参构造 Supplier<Emp> sup02 = Emp::new; Emp emp = sup02.get(); System.out.println(emp); } @Test public void test15(){ Function<Integer,Emp> fun = (x) -> new Emp(x); //调用的是带一个参数的构造:因为函数型接口Function中的apply()有一个参数 Function<Integer,Emp> fun02 = Emp::new; Emp emp = fun02.apply(101); System.out.println(emp); } 数组引用

语法格式:数组类型::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 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjzwg.html