日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

java saf_Java 8 Lambda表达式探险

發布時間:2023/11/27 生活经验 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java saf_Java 8 Lambda表达式探险 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么?

我們為什么需要Lambda表達式

主要有三個原因:

> 更加緊湊的代碼

比如Java中現有的匿名內部類以及監聽器(listeners)和事件處理器(handlers)都顯得很冗長

> 修改方法的能力(我個人理解為代碼注入,或者有點類似JavaScript中傳一個回調函數給另外一個函數)

比如Collection接口的contains方法,當且僅當傳入的元素真正包含在集合中,才返回true。而假如我們想對一個字符串集合,傳入一個字符串,只要這個字符串出現在集合中(忽略大小寫)就返回true。

簡單地說,我們想要的是傳入“一些我們自己的代碼”到已有的方法中,已有的方法將會執行我們傳入的代碼。Lambda表達式能很好地支持這點

> 更好地支持多核處理

例如,通過Java 8新增的Lambda表達式,我們可以很方便地并行操作大集合,充分發揮多核CPU的潛能。

并行處理函數如filter、map和reduce。

怎么做?

實例1 FileFilterFile?dir?=?new?File("/an/dir/");

FileFilter?directoryFilter?=?new?FileFilter()?{

public?boolean?accept(File?file)?{

return?file.isDirectory();

}

};

通過Lambda表達式這段代碼可以簡化為如下:File?dir?=?new?File("/an/dir/");

FileFilter?directoryFilter?=?(File?f)?->?f.isDirectory();

File[]?dirs?=?dir.listFiles(directoryFilter);

進一步簡化:File?dir?=?new?File("/an/dir/");

File[]?dirs?=?dir.listFiles((File?f)?->?f.isDirectory());

Lambda表達式使得代碼可讀性增強了。我承認我開始學習Java的時候對那個匿名內部類感到很困擾,而現在Lambda表達式讓這一切看起來都很自然(尤其是有.NET背景的童鞋會發現這個跟.NET中的Lambda表達式好像)

Lambda表達式利用了類型推斷(type inference)技術:編譯器知道FileFilter只有一個方法accept(),所以accept()方法肯定對應(File?f)?->?f.isDirectory()而且accept()方法只有一個File類型的參數,所以(File?f)?->?f.isDirectory()中的File?f就是這個參數了,.NET把類型推斷做得更絕,如果上面用.NET?Lambda表達式寫法的話是這樣的:

File[]?dirs?=?dir.ListFiles(f?=>?f.isDirectory());

即壓根就不需要出現File類型指示。

實例2 Event HandlerButton?bt?=?new?Button();

bt.addActionListener(new?ActionListener()?{

public?void?actionPerformed(ActionEvent?e)?{

ui.showSomething();

}

});

使用Lambda表達式后:Button?bt?=?new?Button();

ActionListener?listener?=?event?->?{?ui.showSomething();?};

bt.addActionListener(listener);

進一步簡化:Button?bt?=?new?Button();

bt.addActionListener(event?->?{?ui.showSomething();?});

外循環、內循環和Map、Reduce、Filter

一直到現在,處理Java集合的標準做法是采用外循環。比如:List?list?=?new?ArrayList();

list.add("hello");

list.add("world");for(int?item:?list)?{???//?處理item}

還有迭代器循環,它們都是外循環,并且都是順序處理(sequential handling)。順序特性也常常引發ConcurrentModificationException,只要我們嘗試著并發修改集合。

Lambda表達式提供了內循環機制。

我們工作中可能經常面臨下面的需求:>?過濾掉一個集合中不符合條件的元素得到一個新集合>?對集合中的每個元素進行某種轉換,并且對轉換后的集合進行處理>?統計整個集合的某個屬性,比如統計集合元素值的總和或平均值

這些任務即filter、map和reduce,他們的共同特點是:

需要對集合中的每個元素運行一小段相同的代碼。

傳統的實現這些任務的代碼讓人感到很乏味,幸運的是Java 8提供了完成這些任務的更簡潔的方案,當然還是利用Lambda表達式,但也引入了一個新的類庫java.util.functions,包含Predicate、Mapper和Block。

Java 8中,一個Predicate(謂詞)是這樣一個方法:它根據變量的值進行評估(evaluate),返回true或false。

比如下面:List?list?=?getMyStrings();for(String?myString:?list)?{

if(myString.contains(possible))?{

System.out.println(myString?+?"?contains?"?+?possible);

}

}

使用Predicate和Filter后得到下面代碼:List?list?=?getMyStrings();

Predicate?matched?=?s?->?s.equalsIgnoreCase(possible);

list.filter(matched);

進一步簡化:List?list?=?getMyStrings();

list.filter(s?->?s.equalsIgnoreCase(possible));

Lambda表達式語法規則

到目前為止Java 8中的Lambda表達式語法規則還沒有完全確定。

但這里簡單介紹下:

對于前面的:File?dir?=?new?File("/an/dir/");

File[]?dirs?=?dir.listFiles((File?f)?->?f.isDirectory());

accept()方法返回布爾值,這種情況f.isDirectory()顯然也得是布爾值。這很簡單。

而對于:Button?bt?=?new?Button();

bt.addActionListener(event?->?{?ui.showSomething();?});

actionPerformed()方法的返回類型是void,所以需要特殊處理,即在ui.showSomething();左右加上花括號。(想象下不加會怎么樣?如果不加的話,若showSomething()方法返回值是整數類型,那么就意味著actionPerformed()返回整數類型,顯然不是,所以必須加花括號用來標記)。

如果Lambda表達式主體部分包含多條語句,也必須用花括號,并且return語句不能省。

比如下面這個:File?dir?=?new?File("/an/dir/");

File[]?dirs?=?dir.listFiles((File?f)?->??{

System.out.println("Log:...");

return?f.isDirectory();

}

);

總結

以上是生活随笔為你收集整理的java saf_Java 8 Lambda表达式探险的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。