lambda

Java 8 - Lambda表示式

Tarcus Wu 2016/12/20 14:29:48
1444







主題

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 又叫作 lambdaclosure 指的是可以在 function 指涉到外面的變數。在 Java 有限度支援,inner class 中只可以用外面被 final 的變數。

Functional Programming Language在近期,成為一個大家廣為推崇的程式語言模式之一,優勢與好處的分析,可以參考理論化的書籍:https://ihower.tw/blog/archives/6305



Function可以是被傳遞到method當成參數,或是Function可以被當成回傳值。


目前Java達成的功能是Lambda,而最常用的情境如下:

1. MapList、等Collection可以做到循序存取、過濾等功能

2. 以上的循序存取、過濾等功能,因為早期API已經定義好可以操作的method,於是我們每類別要做一樣的事情,只要寫兩組程式碼,但假設我們要寫一個各種類型都可以做同樣操作的時候,寫一個function可以傳給上述的util API

3. 事件Callbackmethod




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. MapList、等Collection可以做到循序存取、過濾等功能


2. 寫一個各種類型都可以做同樣操作的時候,寫一個function可以傳給上述的util API



3. 事件Callbackmethod

甚至可以簡化成

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

Tarcus Wu