一,適用場景:
- 1,接口有且只有一個抽象方法;
- 2,方法的入參中有參數爲接口的實例
此時在調用該方法時就可以使用lambda表達式了
二,使用
1,先來個簡單例子
/**
* @description:
* @author: kismet
* @create: 2018-11-30 15:45
*/
public class Test {
//接口
public interface MyInterface {
//1,只能有一個抽象方法
void method(); //無參數無返回
}
/**
* Title: lambdaMethod Description: 調用lambda接口的方法
*
* @param myInterface 接口MyInterface的實例
* @return
* @author kismet
* @date 2018/11/30 16:06
*/
public static void lambdaMethod(MyInterface myInterface) {//2:有參數爲,接口的實例
//TODO 業務
System.out.println("調用接口實現方法前");
myInterface.method();
System.out.println("調用接口實現方法後");
//TODO 業務
}
public static void main(String[] args) {
//java8之前方式
lambdaMethod(new MyInterface() {
@Override
public void method() {
System.out.println("接口方法實現:無參數");
}
});
//lambda表達式方式
lambdaMethod(() -> System.out.println("接口方法實現:無參數"));
}
}
說明:
- 1,由於爲了直觀顯示,直接將接口定義在類裏面了;
- 2,運行結果
調用接口實現方法前
接口方法實現:無參數
調用接口實現方法後
調用接口實現方法前
接口方法實現:無參數
調用接口實現方法後
2,再來看看有參數,有返回的
/**
* @description:
* @author: kismet
* @create: 2018-11-30 15:45
*/
public class Test4Param {
//接口
public interface MyInterface {
//1,只能有一個抽象方法
int method(String str); //有參數,有返回
}
/**
* Title: lambdaMethod Description: 調用lambda接口的方法
*
* @param myInterface 接口MyInterface的實例
* @param str
* @return
* @author kismet
* @date 2018/11/30 16:06
*/
public static void lambdaMethod(String str, MyInterface myInterface) {//2:有參數爲,接口的實例
//TODO 業務
System.out.println("調用接口實現方法前");
int length = myInterface.method(str);
System.out.println("字符串的長度爲==>" + length);
System.out.println("調用接口實現方法後");
//TODO 業務
}
public static void main(String[] args) {
//java8之前方式
lambdaMethod("求字符串長度", new MyInterface() {
@Override
public int method(String str) {
return str.length();
}
});
//lambda表達式方式
lambdaMethod("lambda求字符串長度", x -> x.length());
}
}
說明:可以看出有無參數或者返回區別在於lambda表達式的書寫形式上;我們來看看lambda的主要幾種書寫形式
-
- 不需要參數,返回值爲 5
() -> 5
- 不需要參數,返回值爲 5
-
- 接收一個參數(數字類型),返回其2倍的值
x -> 2 * x
- 接收一個參數(數字類型),返回其2倍的值
-
- 接受2個參數(數字),並返回他們的差值
(x, y) -> x – y
- 接受2個參數(數字),並返回他們的差值
-
- 接收2個int型整數,返回他們的和(參數類型其實也可以省略)
(int x, int y) -> x + y
- 接收2個int型整數,返回他們的和(參數類型其實也可以省略)
-
- 接受一個 string 對象,並在控制檯打印,不返回任何值(看起來像是返回void)
(String s) -> System.out.print(s)
- 接受一個 string 對象,並在控制檯打印,不返回任何值(看起來像是返回void)
-
- 多行時使用{};在返回值前面加上return就行
() -> {
int i = 3 + 5;
return i;
}
- 多行時使用{};在返回值前面加上return就行
3,lambda雙冒號::的使用
List<String> strings = new ArrayList<>();
strings.add("1");
strings.add("12");
strings.add("123");
strings.forEach(System.out::println);//2,表示調用System.out的println方法
strings.forEach(String::length);//1,表示調用String的length方法
雙冒號XX::yy表示調用XX的的yy方法,如上所示有兩種情況
- 1>當yy爲無參方法時,表示循環調用集合中每個XX實例的yy()方法;
如上面代碼中表示循環調用集合中每個String實例的length()方法; - 2>當yy爲有參方法時,表示調用XX的有參方法yy(XX,xx);並且參數類型爲XX,這樣就把集合中的每個XX作爲yy方法的入參;
如上面代碼中表示循環調用System.out的println方法,並且入參爲集合中的每個String實例;