Java8學習筆記(三)--方法引入

基本概念

格式

實例變量名 | 類名 :: 靜態方法 | 實例方法html

做用

簡化Lambda表達式java

示例

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

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

形式

方法引入總共有四種表現形式:code

類型 示例
引用靜態方法 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. 參數類型及個數相同htm

      好比第1/2/4種形式。對象

  2. 第3種形式比較特殊,需知足如下條件:
    1. 返回值類型相同
    2. 兩個參數
    3. 類型相同blog

      所以會自動適配,不然會報錯,如:Non-Static method cannot be referenced from a static contextget

參考

  1. Method References
  2. 30分鐘入門Java8之方法引用
相關文章
相關標籤/搜索