天天看點

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

基本概念

格式

執行個體變量名 | 類名 :: 靜态方法 | 執行個體方法

作用

簡化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種形式。
  1. 第3種形式比較特殊,需滿足以下條件:
    1. 傳回值類型相同
    2. 兩個參數
    3. 類型相同
是以會自動适配,否則會報錯,如:

Non-Static method cannot be referenced from a static context

參考

  1. Method References
  2. 30分鐘入門Java8之方法引用
Java8學習筆記(三)--方法引入