學習中,如果有錯誤請幫忙及時指出,避免誤導。
一、lambda使用條件
接口中只能有一個未實現的抽象方法(Object中的方法除外,Object中的方法有默認實現),這種接口也叫函數式接口(FunctionalInterface)。
二、lambada表達式的使用
1、靜態方法引用(類:靜態方法)
將一個靜態方法作爲參數傳遞給一個FunctionalInterface,FunctionalInterface中的抽象方法會使用該方法的業務邏輯。
2、實例對象引用(實例:實例方法)
和靜態方法引用類似,只是方法是非靜態的,引用的時候是new出類的實例之後,引用該非靜態方法。
3、參數對象引用(名字感覺怪怪的 類:實例方法)
三、Demo完整代碼
package com.study.lambda;
/**
* @author zhangdj
* @date 2019/7/26
*/
public class LambdaDemo1 {
public static void main(String[] args) {
//調用show方法 並使用lambada表達式實現方法的邏輯
System.out.println("單行語句1---------");
show((n, m) -> n + m + n + m);
//爲了增強可讀性,也可以加上數據類型
System.out.println("單行語句2---------");
show((String n, String m) -> n + m + n + m);
//也可以寫成 語句塊 的形式,可以實現多行業務邏輯,而且必須顯示使用return。 上面兩種方式只能單行
System.out.println("語句塊--------");
show((n, m) -> {
System.out.println(n);
return n + m + n + m;
});
//靜態方法引用 method1方法參數類型 和MyInterface接口中的抽象方法參數類型及個數相同
// 可以使用方法引用 將method1方法作爲邏輯傳遞給MyInterface
System.out.println("靜態方法引用------");
show(LambdaDemo1::staticMethod);
//實例對象引用 就是方法不是靜態的 需要new出實例引用方法
System.out.println("實例對象引用-----");
show(new LambdaDemo1()::noStaticMethod);
//參數對象引用
System.out.println("參數對象引用-----");
//等價於show((n, m) -> m.concat(m))
show(String::concat);
}
public static void show(MyInterface myInterface) {
System.out.println(myInterface.get("a", "b"));
}
public static String staticMethod(String m, String n) {
return m + n;
}
public String noStaticMethod(String m, String n) {
return m + n;
}
/**
* 聲明一個接口,可以使用@FunctionalInterface 標記該接口是一個函數式接口 只要不滿足函數式接口的條件就會報錯
*/
@FunctionalInterface
public interface MyInterface {
String get(String m, String n);
}
}
idea無法編譯lambada表達式解決辦法:https://blog.csdn.net/maqingbin8888/article/details/82698704