方法引用:使用::分隔符實現方法引用
對Lambda表達式不熟悉的可以看這:https://blog.csdn.net/wuud__/article/details/104703443
可以使用方法引用的情況:
- (args) -> ClassName.staticMethod(args)可以簡化爲:ClassName::staticMethod。函數式接口內方法的參數與要引用方法的參數完全一致
- (arg,rest) -> arg.instanceMethod(rest)可以簡化爲:ClassName::instanceMethod。arg是ClassName類型。例:
(list,element) -> list.contains(element);
簡化爲:List::contains;
- (args) -> expr.instanceMethod(args)簡化爲expr::instanceMethod。
具體使用:
- Lambda表達式調用類靜態方法
@FunctionalInterface
public interface FunctionalInterfaceTest {
void add(String s);
}
public class LambdaTest {
public static void print(String s) {
System.out.println("類靜態方法:"+s);
}
public static void main(String[] args) {
FunctionalInterfaceTest fit = (s) -> {
LambdaTest.print(s); // 調用類靜態方法
};
fit.add("sss");
// 簡介寫法
FunctionalInterfaceTest fit = s -> LambdaTest.print(s);
// 還可更簡潔,使用<類名::類方法>格式
FunctionalInterfaceTest fit = LambdaTest::print; // 需要類方法的參數個數與函數式接口的參數個數相同
}
}
- 使用Lambda表達式調用實例方法的格式與調用類方法的格式相同
LambdaTest lt =new LambdaTest();
FunctionalInterfaceTest fit = lt::s; // 格式爲<實例::實例方法>
public void s(String s1,String s2) {
System.out.println("實例方法"+s1+s2);
}
構造方法引用:
- 無參構造,可以利用Supplier接口實現,因爲Supplier接口的抽象方法無需參數。
Supplier<Apple> s = Apple::new;
Apple a = s.get();
- 一個參數的構造方法,可以使用Function接口實現。Function只需一個參數,剛好對應。
public Apple(Integer weight){
this.weight = weight;
}
Function<Integer,Apple> f = Apple::new;
Apple a = f.apply();
- 對應兩個參數的可以使用BiFunction,兩個以上可以自定義函數式接口。用法相同。