内容简介:方法引用就是通过类名或方法名引用已经存在的方法来简化lambda表达式。那么什么时候需要用方法引用呢?如果lamdba体中的内容已经有方法实现了,我们就可以使用方法引用。lamdba写法:方法引用写法:
方法引用就是通过类名或方法名引用已经存在的方法来简化lambda表达式。那么什么时候需要用方法引用呢?如果lamdba体中的内容已经有方法实现了,我们就可以使用方法引用。
一、方法引用的三种语法格式
1. 对象::实例方法名
lamdba写法:
@Test
void test1(){
Consumer<String> con = x -> System.out.println(x);
}
方法引用写法:
@Test
void test2(){
PrintStream out = System.out;
Consumer<String> con = out::println;
}
consumer接口:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
注意:被调用的方法的参数列表和返回值类型需要与函数式接口中抽象方法的参数列表和返回值类型要一致。
2. 类::静态方法名
lamdba写法:
@Test
void test3(){
Comparator<Integer> com = (x, y) -> Integer.compare(x,y);
}
方法引用写法:
@Test
void test4(){
Comparator<Integer> com = Integer::compare;
}
Comparator接口:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
Integer类部分内容:
public final class Integer extends Number implements Comparable<Integer> {
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
}
注意:被调用的方法的参数列表和返回值类型需要与函数式接口中抽象方法的参数列表和返回值类型要一致。
3. 类::实例方法名
lamdba写法:
@Test
void test5(){
BiPredicate<String,String> bp = (x,y) -> x.equals(y);
}
方法引用写法:
@Test
void test6(){
BiPredicate<String,String> bp = String::equals;
}
BiPredicate接口:
@FunctionalInterface
public interface BiPredicate<T, U> {
boolean test(T t, U u);
}
注意:第一个参数是这个实例方法的调用者,第二个参数是这个实例方法的参数时,就可以使用这种语法。
二、构造器引用
类::new
lamdba写法:
@Test
void test7(){
Supplier<Person> supplier = ()->new Person();
}
构造器应用写法:
@Test
void test8(){
Supplier<Person> supplier = Person::new;
}
Supplier接口:
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Person类:
@Data
public class Person implements Serializable {
private static final long serialVersionUID = -7008474395345458049L;
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
注意:person类中有两个构造器,要调用哪个构造器是函数式接口决定的,也就是Supplier接口中的get()方法是无参的,那么就调用的是person中的无参构造器。
三、数组引用
Type::new
lamdba写法:
@Test
void test9(){
Function<Integer,String[]> fun = x -> new String[x];
}
数组引用写法:
@Test
void test10(){
Function<Integer, String[]> fun = String[]::new;
}
Function接口部分内容:
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
总结
- 方法应用及构造器引用其实可以理解为lamdba的另一种表现形式
- 方法引用被调用的方法的参数列表和返回值类型需要与函数式接口中抽象方法的参数列表和返回值类型要一致
- 方法引用中使用类::实例方法的条件是第一个参数是这个实例方法的调用者,第二个参数是这个实例方法的参数
- 构造器引用需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表一致
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- vue中引用阿里字体图标的方法
- c# – 为什么委托在静态方法中使用时不能引用非静态方法?
- 乐字节Java8核心特性实战之方法引用
- Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法
- Java 8 函数式编程:Lambda 表达式和方法引用
- Java 8 函数式编程:Lambda 表达式和方法引用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Google软件测试之道
James A. Whittaker、Jason Arbon、Jeff Carollo / 黄利、李中杰、薛明 / 人民邮电出版社 / 2013-10 / 59.00元
每天,google都要测试和发布数百万个源文件、亿万行的代码。数以亿计的构建动作会触发几百万次的自动化测试,并在好几十万个浏览器实例上执行。面对这些看似不可能完成的任务,谷歌是如何测试的呢? 《google软件测试之道》从内部视角告诉你这个世界上知名的互联网公司是如何应对21世纪软件测试的独特挑战的。《google软件测试之道》抓住了google做测试的本质,抓住了google测试这个时代最......一起来看看 《Google软件测试之道》 这本书的介绍吧!