java方法引用

本文介绍了Java1.8中Lambda表达式提供的方法引用功能,包括ContainingType::methodName形式的使用,以及如何通过函数接口调用特定类的实例方法,同时讨论了静态方法与实例方法的区别和实际调用中的注意事项。
摘要由CSDN通过智能技术生成

前言

JDK1.8之后提供是Lambda,它可以让开发者自定义函数接口中抽象方法的实现,方法引用可以让开发者直接引用已存在的方法。
方法引用的形式:

  • 类::静态方法
  • 类::特定类任意方法
  • 对象::实例方法
  • 类::new

特定类任意方法引用

本篇文章只介绍重点ContainingType::methodName,其他三种结合静态,实例方法调用很容易理解。

函数接口

public interface Encode<T> {
    void encode(T t);
}

特定类

public class Base {
    public void encrypt() {
        System.out.println("Base::speak");
    }
}
public class Derive extends Base{
    @Override
    public void encrypt() {
        System.out.println("Derive::speak");
    }
}

调用

按照规则,静态方法中只能调用静态方法,或者创建实例,通过实例来调用实例方法。但是我们用Base::encrypt好像是静态方法,但它实际是实例方法,此时就是类::特定类任意方法。其实相当于实例调用实例方法。这个实例我们需要通过函数接口的第一个参数传入。所以可以这么调用的,函数接口第一个参数的类型必须是被调用方法所在的类。这里就是函数接口的泛型T。也可以不要泛型,那么函数接口的方法第一个参数必须是Base。

public class MethodReference {
    public static void main(String[] args) {
        Derive base = new Derive();
        Encode<Base> encode = Base::encrypt;
        //这里传入只要是Base类型/子类就会调用相应方法
        encode.encode(base);
        System.out.println(encode);
    }
}

上面实际被调用方法encrypt()是无参的。::只是生成了方法引用encode,并没有实际调用,实际调用时候,encode.encode(实际方法所在的类对象),这里调用的是Base的encrypt方法还是Derive的,当然是Derive,如果想调用Base的,那么传入的Base对象
在这里插入图片描述
如果被调用的是有参的方法呢
在这里插入图片描述

Method References

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值