如果您是一名Java程序員,並且有興趣瞭解更多關於Java8Lambda的知識,那麼在本文中,我們將更深入地瞭解lambda語法和用法。
Java中的lambda表達式是在表達式中表示類的方法的簡潔方法。它有一個參數列表和一個主體。主體可以是單個表達式或塊。它通常用於需要接口實現的地方。當需要一個接口作為調用方法的參數時,通常會出現這種需求。
讓我們看看lambda表達式的一些簡單示例。
下面是一個lambda表達式,它接受兩個數字x和y並計算總和。
(int x,int y) -> x + y;刪除參數類型以獲得更簡潔的表示形式:
(x, y) -> x + y;定義不接受參數的函數:
() -> 404;以下也是有效的,它不接受任何參數,也不返回任何內容:
() -> {}對於單個參數,不需要將參數括起來:
x -> x + 1更復雜的代碼塊也是可能的。下面的lambda接受一個單行參數並對其進行一些處理。請注意,參數的類型是從周圍上下文推斷出來的:
line -> {String[] x = pattern.split(line);return new Player(Integer.parseInt(x[0]), x[1], x[2], x[3], Integer.parseInt(x[4]));}使用lambda表達式有助於使代碼簡潔明瞭。為了幫助實現這一點,Java8類大量使用lambdas。
諸如List、Set、Queue之類的集合類實現了Iterable接口,這使得在元素上進行循環更加容易。
聲明姓名列表。
List<String> names = Arrays.asList("Joe", "Jack", "James", "Albert");不使用lambda循環列表:
for (String name : names) { System.out.println(name);}使用lambda,可以將上述循環編寫為:
names.forEach(name -> System.out.println(name));使用Java 8方法引用,上述內容可以更簡潔地寫成:
names.forEach(System.out::println);映射是鍵到值的映射。在映射上循環涉及在每個(鍵、值)映射上循環。比較一下在這種情況下如何使用lambdas。
首先定義地圖:
Map<String,Integer> map = new HashMap<>();map.put("Atlanta, Georgia", 110);map.put("Austin, Texas", 115);map.put("Baltimore, Maryland", 105);map.put("Birmingham, Alabama", 99);map.put("Boston, Massachusetts", 98);您可以用傳統的方式在地圖上循環:
for (Map.Entry<String,Integer> e : map.entrySet()) { System.out.println(e.getKey() + " => " + e.getValue());}下面是如何使用lambdas以快速簡潔的方式完成相同的操作:
map.forEach((k, v) -> System.out.println(k + " => " + v));lambda表達式的返回類型是什麼?換句話說,在下面的語句中X的類型是什麼?
X x = a -> a + 1;lambda表達式的返回類型是一個函數接口-一個具有單個抽象方法的接口。可以使用兼容的抽象方法將lambda表達式指定給接口。下面是一些例子。
考慮創建一個在單獨線程中執行的任務——您需要將任務定義為可運行接口並實現run()方法。這裡Runnable是一個函數接口。
class MyTask implements Runnable { ... public void run() { // implement your task here System.out.println("Running in a separate thread now."); } ...}然後可以創建MyTask類的實例,並使用它來啟動新的執行線程。
MyTask task = new MyTask();Thread thread = new Thread(task);thread.start();使用lambda,創建Runnable的過程變得更加簡單。上面的任務定義可以重寫為:
Runnable task = () -> System.out.println("Running in a separate thread now.");甚至:
Thread thread = new Thread(() -> System.out.println("Running in a separate thread now."));thread.start();比較器是一個功能接口,用於比較給定類型的對象。它定義了一個名為compare()的抽象方法,可以使用lambda表達式定義該方法。
下面是一個lambda表達式,它創建了一個用於不區分大小寫地比較字符串的比較器。
Comparator<String> cmp = (x, y) -> x.compareToIgnoreCase(y);一旦創建了比較器功能接口的實例,就可以根據需要重新使用它。
在這裡,我們按升序對字符串列表進行排序。
List<String> names = Arrays.asList("Joe", "Jack", "James", "Albert");Collecti***.sort(names, cmp);names.forEach(System.out::println);// printsAlbertJackJamesJoe上面的列表已排序到位。我們現在可以使用binarySearch()方法進行搜索,如下所示:
System.out.println("search(Joe):" + Collecti***.binarySearch(names, "Joe", cmp));# printssearch(Joe):3從列表中計算最大值和最小值也很容易使用lambdas。
定義一些數據:
List<Integer> temps = Arrays.asList(110, 115, 105, 99, 98, 54, 109, 84, 81, 66, 72, 135, 115, 75, 82, 90, 88);使用lambda表達式定義比較器:
Comparator<Integer> cmpTemp = (x, y) -> Integer.compare(x, y);並打印最大值和最小值:
System.out.println("------ Max/Min ------");System.out.println(Collecti***.max(temps, cmpTemp) + "/" + Collecti***.min(temps, cmpTemp));Lambda表達式在GUI編程中也非常有用,可以實現事件處理程序。下面是一個使用按鈕單擊處理程序的示例。
JButton button = new JButton("Click Me");button.addActionListener(e -> System.out.println("Button clicked!"));這是在Java8中使用lambdas的簡要介紹。
自從Java8以來,lambdas讓你的生活變得更輕鬆了嗎?請在下面的評論中解釋。
...謝天謝地,有很多googlechrome擴充套件可以幫你處理“跳過簡介”按鈕。 自動跳過簡介 一旦安裝,這個免費的瀏覽器擴充套件自動點選“跳過簡介”按鈕,只要它出現在您的網頁瀏覽器。你所要做的就是去谷歌Chrome網上商店下...
...動。《紐約客》發表了一篇非常精彩(雖然很短)的小組簡介,值得你花時間閱讀。 正如作家特洛伊·帕特森(Troy Patterson)所解釋的,獨角獸暴動是這些**活動的重要見證人:“報道令人印象深刻的是它與社群的親密關係,它...
...ium的無廣告平臺的方法:他們接管了該地區三位藝術家的簡介。這項活動以設計出租車為特色,與Flipperachi、Moh Flow和Shébani等藝術家合作,用肯德基新漢堡的照片替換他們的簡介標題、專輯封面和簡介頭像。這段新聞影片吹噓說...
...下,一定要檢視彭博商業週刊對這位受人敬愛的執行長的簡介。它在某種程度上消除了“在無數YouTube影片中看到的汗流浹背、氣喘吁吁、興高采烈的小丑形象,比如十年前的“猴子男孩”舞蹈。”這也是一個相當不錯的對這個...
佛蒙特州《七天》雜誌刊登了對傑瑞·馬諾克(Jerry Manock)的採訪,他是蘋果II和第一款一體機Macintosh的設計師。正如沃爾特·艾薩克森(Walter Isaacson)的傳記《史蒂夫·喬布斯》(Steve Jobs)中所描述的那樣,馬諾克(下圖,最右...
《破壞者》是近幾年來最為黯淡的一部引人註目的電視劇,但它陰暗的主題和前景並沒有阻止創意迷們向沃爾特·懷特和他的公司致敬。最新的一張照片來自馬丁·沃蒂斯塞斯,他最初只畫了一幅急需現金的藥劑師的肖像,後來...
前《華爾街日報》記者凱恩(Yukari Kane)的新書將介紹蘋果神祕的執行長蒂姆•庫克(Tim Cook)。《出沒的帝國:史蒂夫·喬布斯之後的蘋果》是一項詳盡調查的結果,它將超越庫克廣為宣傳的山露水習慣和健身制度,揭示這位“...
親愛的Verge讀者, 我有一個自白:我花了一天的大部分時間,在我的腦海裡播放著一個病態的慢動作倦怠的GIF,令人噁心。很光榮。這種情況已經持續發生了大約20年,我預計不會很快停止(如果我們交談時,我好...
...了它的iOS應用程式後,今天將推出它的“whileyou was away”簡介。現在,當你在蘋果裝置上開啟Twitter的官方應用程式時,你將能夠看到自上次登入以來錯過的熱門或相關tweet的快照。該公司表示,該功能將很快在其Android應用程式和...