Java 8 - Lambda表示式
主題: |
Java 8新語法Lambda |
文章簡介: |
了解Lambda與運用方式 |
作者: |
Tarcus Wu |
版本/產出日期: |
V1.0/2016.12.20 |
1. 前言
• 淺談Lambda
• 介紹Lambda的使用方式與時機
2. 目的
• 了解新語法的目標。
• 了解新語法的運用方式。
3. 開始前準備
本架構建立於以下版本的環境:
• JDK8
• Eclipse / Intellij
4. 淺談Lambda
本文章會探討的部份,下文截取該文章的內容 Function 是一級資料, Lambdas 和 Closures, Higher-Order Functions First-class value 表示可以當成變數(或參數)直接傳遞,方法也不能回傳一個 function,在 Java 中甚至連 class 都不是 first-class。在 Ruby 中 function 和 class 都是。 (method 和 function 的語意有一點差別,前者多半指物件中的方法,後者則比較廣義,不一定綁在物件或類別上。) Callback method 的情景是最常需要傳遞 function 的地方,Java 用 anonymous inner class 來解決這個問題。不是不行,只是不同 library 的類別(或介面)和要覆寫的 method 命名都不同,每次都要查。如果程式語言支援統一用 function wrapper 就簡潔多了。這種 anonymous function 又叫作 lambda。closure 指的是可以在 function 指涉到外面的變數。在 Java 有限度支援,inner class 中只可以用外面被 final 的變數。 |
Functional Programming Language在近期,成為一個大家廣為推崇的程式語言模式之一,優勢與好處的分析,可以參考理論化的書籍:https://ihower.tw/blog/archives/6305
Function可以是被傳遞到method當成參數,或是Function可以被當成回傳值。
目前Java達成的功能是Lambda,而最常用的情境如下:
1. Map、List、等Collection可以做到循序存取、過濾等功能
2. 以上的循序存取、過濾等功能,因為早期API已經定義好可以操作的method,於是我們每類別要做一樣的事情,只要寫兩組程式碼,但假設我們要寫一個各種類型都可以做同樣操作的時候,寫一個function可以傳給上述的util API
3. 事件Callback的method
5. 語法介紹
Function exam = (int a, int b) -> { return a * b; };
上述為完整未省略的語法。
()小括號的部份為function會用到的參數,{}大括號內部為function會執行的程式碼
所以多行的程式碼如下:
Function exam = (int a, int b) -> {
if (a == 0) return 0;
if (b == 0) return 0;
return a * b;
};
要執行該Function實例則使用
exam(5, 7);
另外,lambda語法可以做省略的動作, 以下面的範例做例子
Function exam = (int a, int b) -> { return a * b; };
1. 省略參數型態
(a, b) -> { return a * b; }; //int不見了 |
2. 若function執行只有一行程式碼,可以省略大括號
(a, b) -> return a * b; // {、}、 不見了 |
3. 若function執行只有一行程式碼,可以省略return
(a, b) -> a * b; // return 不見了 |
4. 若function只有一個參數,可以省略小括號
a -> a * 3; |
6. 使用時機
1. Map、List、等Collection可以做到循序存取、過濾等功能
2. 寫一個各種類型都可以做同樣操作的時候,寫一個function可以傳給上述的util API
3. 事件Callback的method
甚至可以簡化成
button.addActionListener(e -> System.out.println(“Action Detected”));
原本的三行程式碼,變成一行且結構讓人閱讀起來不會不自然了。
7. 參考來源
• Functional Programming for Java Developers 讀書摘要
https://ihower.tw/blog/archives/6305
• Java 8 new features tutorial
https://www.tutorialspoint.com/java8/java8_lambda_expressions.htm
• Stackoverflow Discussion
http://stackoverflow.com/questions/21833537/java-8-lambda-expressions-what-about-multiple-methods-in-nested-class
• 特別感謝:Oster Huang