java中使用Lambda表達式的5種語法

https://www.cnblogs.com/kangkaii/p/8419082.html

1,標準寫法

思考下述情況:

String[] arr = {"program", "creek", "is", "a", "java", "site"};
Arrays.sort(arr, (String m, String n) -> Integer.compare(m.length(), n.length()));
System.out.println(Arrays.toString(arr));

lambda表達式的標準寫法由下面幾點構成:

  • 以逗號分隔,以()關閉的形參:(Dog m, Dog n)
  • 箭頭標記:->
  • 主體部分則是一個單表達式或者聲明代碼塊。如下是單表達式形式:Integer.compare(m.getWeight(), n.getWeight())

輸出:
[a, is, java, site, creek, program]

2,參數類型可以推斷

如果參數的類型可以根據上下文推斷出來,則可以省略掉類型。
在上面的代碼中,參數 m 與 參數 n 可以推測出來是String類型,所以可以省略。這樣會讓代碼變得更加簡潔,並且也更像是一個lambda表達式。

String[] arr = { "program", "creek", "is", "a", "java", "site" };
Arrays.sort(arr, (m, n) -> Integer.compare(m.length(), n.length()));
System.out.println(Arrays.toString(arr));

3,存在多行代碼

如果sort() 裏面的代碼一行寫不下的話,可以多行,但需要{} 括起來。而且代碼應該有明確的返回語句。

String[] arr = { "program", "creek", "is", "a", "java", "site" };
Arrays.sort(arr, (String m, String n) -> {
    if (m.length() > n.length())
        return -1;
    else
        return 0;
});
System.out.println(Arrays.toString(arr));

輸出:

[program, creek, java, site, is, a]

4,單個參數並可推斷類型

Parenthesis can be omitted for single parameter lambda expression when types can be inferred.
單個參數的lambda表達式,在參數類型可以推斷出來的時候,可以省略參數 “x” 的括號。

String[] arr = { "program", "creek", "is", "a", "java", "site" };
Stream<String> stream = Stream.of(arr);
stream.forEach(x -> System.out.println(x));

輸出:

a
is
java
site
creek
program

5,方法引用

利用方法引用,上面的代碼也可以被寫成如下形式:

Stream<String> stream = Stream.of(arr);
stream.forEach(System.out::println);

6,沒有參數

當一個參數都沒有的時候,仍然可以使用lambda表達式。如下:
() -> {for(int i=0; i<10; i++) doSomthing();}
***

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章