4. 方法引用

方法引用可以让我们的表达式更加简洁
举个例子:

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 方法,输出如下

9167995-7c9b09f5f2cb42de
image

2. 静态方法的 方法引用

接着我们用是一个对象 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 方法里面调用一下上面这个方法,看输出


9167995-e52ebe524f079b3a
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 方法调用 运行这个方法,输出如下


9167995-6f3f10ea1101b6a6
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

猜你喜欢

转载自blog.csdn.net/weixin_34413357/article/details/87273084