JAVA 8 Lambda表達式-Lambda Expressions

Lambda表達式介紹

Lambda表達式是在java規範提案JSR 335中定義的,Java 8 中引入了Lambda表達式,並被認爲是Java 8最大的新特性,Lambda表達式促進了函數式編程,簡化了Java編程開發。html

背景知識

匿名內部類

在Java中,匿名內部類通常適用於那些在Java應用中只會出現一次的實現類,舉個例子,在標準的Swing或JavaFX應用中,有不少鍵盤和鼠標的事件處理程序,通常狀況下,你不須要寫一個單獨的事件處理類,而是使用以下方式(有Swing編程經驗的應該很熟悉吧):java

        JButton testButton = new JButton("Test Button");
        testButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                System.out.println("Click Detected by Anon Class");
            }
        });

不這樣作的話,你須要針對每個事件寫一個單獨的ActionListener接口的實現類,這樣的代碼並不優雅,由於僅僅爲了定義一個方法就須要附加寫一大堆的代碼。一般,哪裏須要,就在哪裏建立對應的匿名內部類,這樣的代碼可讀性會更強。web

Functional Interfaces函數式接口

首選,咱們來觀察下上面提到的ActionListener接口的定義,以下:express

package java.awt.event;

import java.util.EventListener;


public interface ActionListener extends EventListener {

    /**
     * Invoked when an action occurs.
     */
    public void actionPerformed(ActionEvent e);

}

在上面的代碼中,只定義了一個抽象方法,在Java 8中,像這樣的接口被稱爲「functional interface」。一般在Java中,咱們常常使用匿名內部類來實現函數式接口,這是一種很常見的使用模式;編程

另外,在JDK中,除了ActionListener接口外,相似的還有Runnable和Comparator接口。oracle

Lambda表達式語法

Lambda表達式的語法形式以下:ide

parameter -> expression body

主要組成:參數列表 + 箭頭 + 表達式體,如 (int x, int y) -> x + y函數式編程

其中,表達式體能夠是一條表達式,也能夠是一個語句塊(多條代碼語句);函數

Lambda表達式具備以下特徵:ui

  • 【可選】類型聲明:參數的類型不須要聲明,編譯器能夠根據參數值推斷出其類型;
  • 【可選】括號:單個參數的話,不須要用圓括號包圍參數,固然,對於多個參數或無參數的話,括號是須要的;
  • 【可選】花括號:若是表達式主體只有一條語句的話,不須要用花括號包圍,固然,對於多條語句,花括號是須要的;
  • 【可選】return關鍵字:若是表達式主體是單一表達式,return關鍵字能夠不寫,編譯器能夠自動返回該值,固然,若是寫了return,則須要加上花括號;

舉個例子:

package lambda;

/**
 * LambdaTest
 * 
 * @author Pi Chen
 * @version V1.0.0, 2016年9月19日
 * @see
 * @since V1.0.0
 */
public class LambdaTest
{
    public static void main(String args[])
    {
        LambdaTest tester = new LambdaTest();

        // 有參數類型
        MathOperation addition = (int a, int b) -> a + b;

        // 無參數類型
        MathOperation subtraction = (a, b) -> a - b;

        // 有花括號,有return關鍵字
        MathOperation multiplication = (int a, int b) -> {
            return a * b;
        };

        // 無花括號,無return關鍵字,單一表達式狀況
        MathOperation division = (int a, int b) -> a / b;

        // MathOperation調用示例
        System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
        System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
        System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
        System.out.println("10 / 5 = " + tester.operate(10, 5, division));

        // 有括號
        GreetingService greetService1 = message -> System.out.println("Hello " + message);

        // 無括號,單個參數狀況
        GreetingService greetService2 = (message) -> System.out.println("Hello " + message);

        // GreetingService調用示例
        greetService1.sayMessage("Mahesh");
        greetService2.sayMessage("Suresh");
        
        //有括號, 無參狀況
        Runnable runTest = () -> System.out.println("Running");
        //Runnable調用示例
        runTest.run();
    }

    // 內部接口
    interface MathOperation
    {
        int operation(int a, int b);
    }

    interface GreetingService
    {
        void sayMessage(String message);
    }

    interface Runnable
    {
        void run();
    }
    
    private int operate(int a, int b, MathOperation mathOperation)
    {
        return mathOperation.operation(a, b);
    }
}

關鍵點說明:

  • Lambda表達式主要用於定義一個函數式接口(functional interface:一個只包含一個抽象方法的接口)的內聯實現,在上面的例子中,咱們使用了各類類型的Lambda表達式來實現MathOperation接口的operation方法,接着又實現了GreetingService接口的sayMessage方法,Runnable接口的run方法;
  • Lambda表達式消除了匿名類的使用而且賦予Java簡單且強大的函數式編程能力;

參考資料

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html#overview

https://www.tutorialspoint.com/java8/java8_lambda_expressions.htm

相關文章
相關標籤/搜索