一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 一文帶你徹底搞懂Lambda表達式

一文帶你徹底搞懂Lambda表達式

2020-09-27 14:55xqnode Java教程

這篇文章主要介紹了一文帶你徹底搞懂Lambda表達式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

1. 為什么使用Lambda表達式

Lambda是一個匿名函數,我們可以把Lambda表達式理解為是一段可以傳遞的代碼(將代碼像數據一樣進行傳遞)。可以寫出更簡潔、更靈活的代碼。作為一種更緊湊的代碼風格,使Java的語言表達能力得到了提升。

我們來看一下使用lambda之前創建匿名內部類:

?
1
2
3
4
5
6
new Thread(new Runnable() {
  @Override
  public void run() {
    System.out.println("執行Runnable方法");
  }
});

lambda表達式:

new Thread(() -> System.out.println("執行Runnable方法")); // 無參Lambda表達式

在Idea中遇到可以轉換lambda的代碼會有灰色提示,按alt+enter可自動轉換:

一文帶你徹底搞懂Lambda表達式

2. Lambda語法

Java8中引入了一個新的操作符"->”該操作符稱為箭頭操作符或Lambda 操作符。

箭頭操作符將Lambda表達式拆分成兩部分:

左側: Lambda表達式的參數列表

右側: Lambda表達式中所需執行的功能,即Lambda體

示例:

語法格式一:無參數,無返回值。

Runnable r = () -> System.out.println("Hello World");

r.run();

語法格式二:有一個參數,并且無返回值。

?
1
2
3
Consumer consumer = (x) -> System.out.println(x);
//或者寫成: x -> System. out.println(x); 只有一個參數,括號可以省略
consumer.accept("Hello");

語法格式三:有兩個以上的參數,有返回值,并且Lambda體中有多條語句。

?
1
2
3
4
5
Comparator<Integer> comparator = (x, y) -> {
  System.out.println("Hello");
  return Integer.compare(x, y);
};
TreeSet<Integer> treeSet = new TreeSet<>(comparator);

語法格式四:若Lambda體中只有一條語句,return 和大括號都可以省略不寫,Lambda 表達式的參數列表的數據類型可以省略不寫,因為JVM編譯器通過上下文推斷出數據類型,即類型推斷

Comparator<Integer> com = (x, y) -> Integer .compare(x, y);

關于類型推斷,其實在數組中我們早已經使用過:

?
1
2
3
4
5
6
String[] strArr = {"a","b", "c"}; // 類型推斷
// 寫成下面這種方式則編譯報錯
String [] strArr;
strArr = {"a","b", "c"};
// 還有List的類型推斷:
List<String> list = new ArrayList<>();

3. 函數式編程接口

上面我們看到的lambda表達式,其實都依賴于接口的支持,lambda表達式的本質是對接口的一種實現。這種接口稱為函數式接口,即接口中只有一個抽象方法的接口。函數式接口可以使用@FunctionInterface注解修飾,表示被修飾的接口必須是函數式接口。

?
1
2
3
4
5
// 函數式接口只能有一個抽象方法
@FunctionalInterface
public interface FuncTest {
  void accept(Object o);
}

如果在函數式接口中寫兩個以上的方法,編譯會報錯:

一文帶你徹底搞懂Lambda表達式

我們來自己寫一個實際的例子了解下函數式接口的使用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
// 1.寫一個對傳入參數進行操作的函數式接口
@FunctionalInterface
public interface FuncTest {
  void operation(Integer x);
}
 
// 2.寫一個方法,將函數式,接口作為參數
private static Integer operate(Integer a, FuncTest funcTest) {
  return funcTest.operation(a);
}
 
// 3.使用函數式接口
System.out.println(operate(1, (x) -> x + x)); // 輸出 2

可以看到,我們在第3步才開始定義函數式接口的實際功能,對兩個數進行相加操作并返回結果。lambda的最大便捷之處就在于此,將代碼作為參數傳遞,非常靈活,大大精簡我們的代碼。

4. Java8內置的4種常用函數式接口

Consumer :消費型接口

方法:void accept(T t);

Consumer<String> consumer = x -> System.out.println(x);

consumer.accept("Hello"); // 打印Hello

Supplier :供給型接口

方法:T get();

Supplier<String> supplier = () -> "Hello";

System.out.println(supplier.get()); // 打印Hello

Function<T, R> :函數型接口

方法:R apply(T t);

Function function = x -> "Hello " + x;

System.out.println(function.apply("World"));

Predicate :斷言型接口

方法:boolean test(T t);

Predicate predicate = x -> x == "Hello";

System.out.println(predicate.test("Hello"));

ava.util.function 它包含了很多類,用來支持 Java的 函數式編程,該包中的函數式接口有:

一文帶你徹底搞懂Lambda表達式

5. 總結

Java8引入lambda表達式是接收了函數式編程語言的思想,例如scala之類的,它將函數視為一等公民,可以使用高階函數等。和指令式編程相比,函數式編程強調函數的計算比指令的執行重要。和過程化編程相比,函數式編程里函數的計算可隨時調用。

lambda表達式可以使代碼看起來簡潔,但一定程度上增加了代碼的可讀性以及調試的復雜性,所以在使用時應盡量是團隊都熟悉使用,要么干脆就別用,不然維護起來是件較痛苦的事。

以上這篇一文帶你徹底搞懂Lambda表達式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/xqnode/article/details/106966304

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本全黄三级在线观看 | 男人狂躁女人下面的视频免费 | 成人小视频在线观看免费 | 欧美日韩亚洲一区二区三区在线观看 | 午夜无码国产理论在线 | 午夜影院一区二区三区 | 日本mv精品中文字幕 | x8x8在线观看 | 亚洲精品在线看 | 韩国理论三级在线观看视频 | 秋霞在线观看成人高清视频51 | 亚洲第五页 | 丰腴尤物贵妇浪荡小说 | 11 13加污女qq看他下面 | 国产精品亚洲w码日韩中文 国产精品香蕉在线观看不卡 | 亚洲成av人在线视 | 亚洲国产精品一在线观看 | 校园全肉高h湿一女多男 | 亚洲网红精品大秀在线观看 | 国产伦久视频免费观看视频 | 九草在线视频 | 国产精品日韩欧美一区二区三区 | 免费观看在线永久免费xx视频 | 男人的天堂久久精品激情a 男人的天堂va | 草莓视频深夜释放 | 色姑娘色综合 | 丰满岳乱妇在线观看视频国产 | 性啪啪chinese东北女人 | 久久国产综合精品欧美 | 高h细节肉爽文办公室 | 日本一区二区免费在线 | 国产成人综合网亚洲欧美在线 | 女人用粗大自熨喷水在线视频 | 亚洲日本中文字幕天堂网 | 精品视频免费在线观看 | 秋霞鲁丝影院久久人人综合 | 国产欧美视频一区二区三区 | 91国产高清 | 亚欧有色在线观看免费版高清 | 97操 | 九九精品视频在线观看 |