Java8学习笔记(三)--方法引入

本文详细介绍了Java8中方法引用的基本概念、格式、作用及应用示例。通过具体实例展示了如何使用方法引用简化Lambda表达式,并针对不同形式的方法引用进行了说明。

基本概念

格式

实例变量名 | 类名 :: 静态方法 | 实例方法

作用

简化Lambda表达式

示例

a -> System.out.println(a); <=> System.out::println

(a, b) -> a.compareTo(b); <=> String::compareTo;

形式

方法引入总共有四种表现形式:

类型示例
引用静态方法ContainingClass::staticMethodName
引用某个对象的实例方法containingObject::instanceMethodName
引用某个类型的任意对象的实例方法ContainingType::methodName
引用构造方法ClassName::new

应用

POJO

public class Emp {
    private int empno;
    private String ename;
    //其余方法略
}
引用静态方法
    @FunctionalInterface
    public interface StaticMethod {
        int min(int a, int b);
    }

    StaticMethod staticMethod = (a, b) -> Math.min(a,b);
    StaticMethod staticMethod1 = Math::min;
引用某个对象的实例方法
@FunctionalInterface
public interface InstanceMethodOfParticularObject {
    void setEmpName(String name);
}

    Emp emp = new Emp(1,"eName");
    
    //普通Lambda表达式
    InstanceMethodOfParticularObject instanceMethodOfParticularObject = name -> emp.setEname(name);
    instanceMethodOfParticularObject.setEmpName("haha");
    System.out.println(emp.getEname());
    
    //方法引入--引用某个对象的实例方法
    InstanceMethodOfParticularObject instanceMethodOfParticularObject1 = emp::setEname;
    instanceMethodOfParticularObject1.setEmpName("xixi");
    System.out.println(emp.getEname());
引用某个类型的任意对象的实例方法
@FunctionalInterface
public interface InstanceMethodOfArbitraryObject {
    boolean equale(String a,String b);
}

    InstanceMethodOfArbitraryObject instanceMethodOfArbitraryObject = (a, b) -> a.equals(b);
    InstanceMethodOfArbitraryObject instanceMethodOfArbitraryObject1 = String::equals;

    System.out.println(instanceMethodOfArbitraryObject1.equale("a","b"));
    System.out.println(instanceMethodOfArbitraryObject.equale("a","a"));
引用构造方法
@FunctionalInterface
public interface ConstructorWithFullFields {
    Emp getNewEmp(int empno,String ename);
}

    //无参构造
    ConstructorWithNoField<Emp> constructorWithNoField = ()-> new Emp();
    ConstructorWithNoField<Emp> constructorWithNoField1 = Emp::new;

    //全参构造
    ConstructorWithFullFields constructorWithFullFields = ((empno, ename) -> new Emp(empno,ename));
    ConstructorWithFullFields constructorWithFullFields1 = Emp::new;

总结

  1. 一般情况下,用方法引入代替普通Lambda表达式均满足以下条件:
    1. 返回值类型相同
    2. 参数类型及个数相同

      比如第1/2/4种形式。

  2. 第3种形式比较特殊,需满足以下条件:
    1. 返回值类型相同
    2. 两个参数
    3. 类型相同

      因此会自动适配,否则会报错,如:Non-Static method cannot be referenced from a static context

参考

  1. Method References
  2. 30分钟入门Java8之方法引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值