4. 方法引用

作者: HmilyMing | 来源:发表于2019-01-26 22:58 被阅读2次

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

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

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 方法里面调用一下上面这个方法,看输出


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

相关文章

  • 4. 方法引用

    方法引用可以让我们的表达式更加简洁举个例子: 1. 方法引用 我们在上一节有这么一种写法 箭头函数左边是匿名函数的...

  • 4.引用

    变量:对象的引用 变量存储对象的内存地址 对象:堆内存 变量:栈内存 python不用声明变量类型,但对象有类型,...

  • jdk1.8新特性

    目录: 1. LAMBDA表达式(重点) 2. 函数式接口 3. 方法引用于构造器引用 4. Stream API...

  • 0.Java8 简介

    1. lambda 表达式 2. 函数式接口 3. 方法引用于构造器引用 4. Stream API 5. 接口中...

  • VUE-方法methods

    1.methods为VUE提供存放方法的地方 2.方法的简单应用 3.方法传值 4.方法中引用data中的属性 5...

  • JDK1.8特性之Release Notes

    JDK1.8主要更新如下内容: 1. Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. S...

  • Java8新特性

    1.Lambda表达式 2.Stream函数式操作流元素集合 3.接口新增:默认方法与静态方法 4.方法引用,与L...

  • 2020-07-04【方法引用】

    体验方法引用 方法引用符 引用方式

  • 2019-01-29——Java8新特性的理解

    一.Java8的十大特性 1.Lambda表达式 2.接口的默认方法和静态方法 3.方法的引用 4.重复注解 5....

  • 掌握这5种方法轻松写出精彩的结尾(21天写作训练营第十课课后心得

    掌握以下5种方法写出精彩结尾: 1.进行概括或总结 2.摆上干货或经验 3.引用台词或歌词 4.引用诗词或名言 5...

网友评论

    本文标题:4. 方法引用

    本文链接:https://www.haomeiwen.com/subject/fxopjqtx.html