方法引用可以让我们的表达式更加简洁
举个例子:
1. 方法引用
我们在上一节有这么一种写法
Consumer<String> consumer = i -> System.out.println(i);
箭头函数左边是匿名函数的参数,右边是函数执行体。
当你的执行体只有一个函数调用,且这个函数的参数和箭头左边是一样的,可以写成方法引用,如下
Consumer<String> consumer = System.out::println;
完整的代码:
public class MethodRefrenceDemo {
public static void main(String[] args) {
Consumer<String> consumer = i -> System.out.println(i);
Consumer<String> consumer2 = System.out::println;
consumer.accept("input data 1");
consumer.accept("input data 2");
}
}
运行 main 方法,输出如下
image2. 静态方法的 方法引用
接着我们用是一个对象 Dog
class Dog{
private String name = "哮天犬";
public static void brak(Dog dog){
System.out.println(dog + " 叫了");
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
'}';
}
}
然后写个方法进行测试调用
public static void test2(){
Consumer<Dog> consumer = Dog::brak;
Dog dog = new Dog();
consumer.accept(dog);
}
在main 方法里面调用一下上面这个方法,看输出
image
可以看出方法的使用便捷性了没。
3. 非静态方法,使用对象实例的方法引用
在上面的 Dog 类中加一个成员方法
private int food = 10;
public int eat(int num){
System.out.println("吃了 " + num " 斤狗粮");
this.food -= num;
return this.food;
}
写个方法进行调用测试
public static void test3(){
// 成员方法的方法引用
Dog dog = new Dog();
Function<Integer, Integer> function = dog::eat;
System.out.println("还剩下 " + function.apply(2) + " 斤");
}
用 main 方法调用 运行这个方法,输出如下
image
UnaryOperator<Integer> function = dog::eat;
或者
IntUnaryOperator function = dog::eat;
System.out.println("还剩下 " + function.applyAsInt(2) + " 斤")
这些都是可以的。
大家想一想,为什么在静态方法里面没有 this 指针,而成员方法里面可以用 this?这是因为在成员方法里面,默认在方法的参数里面把当前实例传进去了。
证明:
修改一下 eat 方法,修改成如下
public int eat(Dog this, int num)
然后在调用时,你照样
dog.eat(1);
只要传一个参数,这样就能进行调用。
还可以这样做:
BiFunction<Dog, Integer, Integer> eatFunction = Dog::eat;
System.out.println("还剩下 " + eatFunction.apply(dog, 1) + " 斤");
用这种方式调用,运行发现没问题,然后你再把 eat 方法改成下面的
public int eat(int num)
只有一个参数了,但是也是不报错的
4. 构造函数的 方法引用
默认的无参构造函数
Supplier<Dog> supplier = Dog::new;
System.out.println("创建了新对象:" + supplier.get());
在之前代码的基础上,这样子即可调用。
有参的:
先加上这两个构造函数
public Dog(){
}
public Dog(String name){
this.name = name;
}
调用时:
Function<String, Dog> function2 = Dog::new;
System.out.println("创建了新对象:" + function2.apply("大黄 "));
代码地址: https://github.com/hmilyos/lambda-demo.git
网友评论