琢磨琢磨方法引用以及lambda--白话Lambda和方法引用

本文详细介绍了Java中的方法引用和Lambda表达式的概念及使用。通过实例展示了如何在代码中应用方法引用,强调了方法引用与Lambda的区别,以及它们如何简化接口的实现。同时,文章提供了`NotificationHandler`类的示例,演示了在实际场景中如何利用方法引用实现通知发送的两种方式。
摘要由CSDN通过智能技术生成

方法引用:

就是直接传递一个类的指定方法,进行复用,而不是方法的返回值;
比如如下:
在这里插入图片描述
方法要求传入一个Consumer<? super Engin action> void
在这里插入图片描述
要求传入一个无返回值的方法;同时实现接口时要求参数泛型必须为Engine
那我们传入的方法就必须是参数类型为Engine的方法
在这里插入图片描述


再如图:
在这里插入图片描述
在这里插入图片描述

参数需要一个方法:
方法必须有返回值,任意泛型,,参数也是任意泛型

在这里插入图片描述


后续补充:

自己试试

public class MS {
    public static void main(String[] args) {
        // lambda并不是创建方法并执行,而是在用简略的方法实例化对象,同时指定具体的执行内容
        DoSome doSome = () -> System.out.println("?");
        doSome.doSomething();
        // 这里呢就需要描述具体的方法签名了
        DoSomeHasParam doSomeHasParam = (x)->{ };
        doSomeHasParam2.doSomething(1);

        // 而在实例化指定执行方法时,可以使用已有方法,进行方法引用,但是要求返回值与参数必须与接口抽象方法一致
        // 而且只能引用static方法的类
        DoSome doSome1 = PublicMethod::doSome; // 写法
        doSome1.doSomething();

        // 可以看到,使用方法是一样的,只是参数的传递需要在真正使用时传递,因为他是【引用】,借你方法一用!
        // 然后你调用接口的方法就相当于调用了引用的那个方法,提供参数是不是很河里。
        // 但是阿,千万注意,接口的那个方法,签名类型一定要和引用的一致!
        DoSomeHasParam doSomeHasParam =PublicMethod::doSomeHasParam; // 有参
        doSomeHasParam.doSomething(9527);
    }
}

// 接口含有一个无参抽象方法
interface DoSome {
    void doSomething();
}

// 接口含有一个有参抽象方法
interface DoSomeHasParam {
    void doSomething(int i);
}

// 提供方法引用的类
class PublicMethod {

    // 无参方法
    static void doSome() {
        System.out.println("公开无参方法");
    }

    // 有参方法
    static void doSomeHasParam(int i) {
        System.out.println("公开有参方法,参数:"+i);
    }
}


总结:

lambda这东西阿,其实就是在创建一个接口的实现类,不同的是用一种简洁的方式创建而已,本质上还是匿名内部类,所以lambda=匿名内部类=创建实例=临时实例=new!

方法引用这玩意呢,其实就是对一个已有方法的引用,注意,并不是直接在lambda里就创建方法的全部信息了。因为lambda是在实例化一个对象,而方法引用相当于在实例化的时候借用了一个别的类的方法过来填进去(当然方法签名要和接口的抽象方法一致),被借用的方法只有真正执行的时候我们才需要传递参数;


旁白君A:为什么lambda实例化的时候就要传递参数了呢?
旁白君B:你没看到你后面lamda写的内容就是在描述具体的方法内容了吗!不给你需要的参数你怎么写对参数的操作!你没发现这里是个你自己可以随便起名字的变量,也就是他只是个代号!真正用这个参数的时候,害不是得再传递一波参数;相当于我们引用的那个方法人家自己就有定义所需参数了,以及执行流程,不需要你了!这个家已经没有你的位置了
也就是说lambda需要我们对方法签名进行描述,而方法引用自己已经有了确切的方法签名描述所以不需要了,如果方法签名不匹配你连引用都引用不了,直接编译不通过


所以阿,这一切都建立在接口的抽象方法之上,而lambda和方法引用所做的就是把一个抽象的东西变得具体

具体了以后的调用就和普通类的使用无区别了;因为他就是普通的类阿!


至此,,,初步了解了大概的用法,,剩下的就是实践了。后续更新…

练习


public class NotificationHandler {

    private  NotificationBody notificationBody;

    public NotificationHandler(NotificationBody notificationBody) {
        this.notificationBody = notificationBody;
    }

    public NotificationHandler() {
    }

    // 发送方法一,通过成员变量获取具体实现类,而成员变量通过构造器注入,并在构造中创建具体实现
    public boolean doSend(){
        Notification notification = notificationBody.defineNotificationContent(1L);
        sendNotification(notification);
        return true;
    }
    // 发送方法二,直接在参数中接收抽象方法,调用抽象方法发送
    public boolean doSend2(NotificationBody notificationBody){
        Notification notification = notificationBody.defineNotificationContent(22L);
        sendNotification(notification);
        return true;
    }

    private void sendNotification(Notification notification) {
        System.out.println("消息发送了:==>" + notification);
    }

    public static void main(String[] args) {
        // 通过构造注入lambda
        NotificationHandler notificationHandler = new NotificationHandler(recUserId -> Notification.builder().recUserId(recUserId).build());
        notificationHandler.doSend();

        // 直接引用已有方法的指定实现方法,通过方法引用按照接口方法签名引用具体实现方法
        NotificationHandler notificationHandler2 = new NotificationHandler();
        notificationHandler2.doSend2(NotificationHandler::getNotification);
    }

    public static Notification getNotification(Long userId){
       return Notification.builder().recUserId(userId).build();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值