基本概念
格式
執行個體變量名 | 類名 :: 靜态方法 | 執行個體方法
作用
簡化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;
總結
- 一般情況下,用方法引入代替普通Lambda表達式均滿足以下條件:
- 傳回值類型相同
- 參數類型及個數相同
比如第1/2/4種形式。
- 第3種形式比較特殊,需滿足以下條件:
- 傳回值類型相同
- 兩個參數
- 類型相同
是以會自動适配,否則會報錯,如: Non-Static method cannot be referenced from a static context
參考
- Method References
- 30分鐘入門Java8之方法引用
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiETPwJWZ3ZCMwcTP39zZwpmLuJkbhV3ZE10dNpWTwkkaOhXRUxUMZR1TwUEVOlXRq10dFR1T3VkaNdXSUxUMrpmTx0keMVTQU1UeBpWT2VFVPJTV61kdjJjYzpkMMRXOykVdNNjW2hXbZVnTtx0dJRUT5N2ViBXO5xkNNh0YwIFSh9CXt92YuM3YltWas5iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)