Lambda表達式是Java8裡的一個重要特性,發布這麼久了,最近在學swift語言時發現了其中的閉包的概念其實跟Lambda表達式極其相似,於是今天整理一下Java8中的Lambda表達式,做個介紹。
Lambda表達式其實就是提供Java編程中對於函數式編程的支持,在我們習慣了一切皆對象時,剛接觸Lambda可能讀起來比較費勁,但是習慣之後,其確實有助於代碼的簡潔,且在Python、swift等中都有類似於Lambda這種概念,未來可能大家都會用到,所以學習下還是有幫助的。
Lambda基本語法:([parameter…]) -> { statements; } //[]表可選,即括號可以無參
接下來我們通過一些實例來學習Lambda:
一:遍歷
Java8在迭代器Iterable中新增了方法forEach(Consumer action),參數為一個Lambda表達式,即一個方法,接下來看下用法:
圖中可以看到,以前需要3行的代碼,現在可以一行解決,甚至可以更簡潔,如下:
其中的::符號之前是作用域,之後是具體方法,例如Objest::hashCode,上圖中也一樣System.out其實是一個PrintStream對象,PrintStream對象有一個Println方法。
另外隨口說一句,這個地方用到Arrays.asList()方法,大家可能經常用這個方法來返回List,但是這個地方有個要注意的地方是,Arrays.asList()返回的是java.util.Arrays的一個內部類java.util.Arrays.ArrayList<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPqOsus3O0sPHxr2zo9PDtcQ8c3Ryb25nPmphdmEudXRpbC5BcnJheUxpc3Q8L3N0cm9uZz7Kx7K70rvR+bXEo6xqYXZhLnV0aWwuQXJyYXlzLkFycmF5TGlzdLK7xNzX9mFkZCgpstnX96Osy+TIu7Hg0uuyu7vhsai07aOstavKx9TL0NC74bGotO2jrLHg0uvNqLn9ysfS8s6qztLDx9a4z/K1xL3Tv9rKx0xpc3SjrExpc3TW0MrH09BhZGQoKbe9t6i1xKO6PGJyIC8+DQo8YnIgLz4NCjxpbWcgYWx0PQ=="" src="http://www.bkjia.com/uploads/allimg/160408/04303aS0-2.png" title="\" />
二:Runnable
Lambda表達式可以極大程度簡化匿名內部類的代碼,如下:
當然也可以簡化如下:
三:Arrays排序
Arrays.sort()我們也經常會用到,我們來看下lambda表達式寫的排序:
圖中可以看到,lambda表達式可以在一行內完成所需功能,精簡了很多代碼,且習慣了以後可讀性也高,這裡寫這個例子主要是讓大家看看lambda有多個參數時的寫法,至於其中的Arrays.stream()我會在後面寫一篇文章專門講它,以及它的Map、reduce、filter等方法,此處只需要知道他返回的是一個Stream對象,可以傳入lambda表達式進行遍歷過濾操作即可。
四:Predicate
Predicate翻譯為斷言,作為參數時表示此處需傳入一個返回true和false的lambda表達式,我們先看其使用方法:
Predicate的test方法返回值為bool,看其源碼時發現其還有and、or等方法,那麼下面看一下Predicate可能的應用場景,對於一個數組做篩選操作:
上圖中可以看到,filter方法傳入了兩個lambda表達式,分別是判斷字符串長度是否大於4和是否以A結尾,在filter方法中,通過and連接,各位也可以換成or試試效果,結果返回的List中只包含所需數據。
五:其他
另外有一點需要注意的是,由於lambda表達式相當於匿名內部類,所以其中引用的外部參數需要是fina的,所以不能賦值,跟匿名內部類一樣,會在編譯期報錯,如下:
Java8的新特性的stream,有問題的可以關注微信公眾號後留言提出。