衆所周知,java8支持lambda表達式,常見的一些操做均可以經過lambda來實現,好比遍歷List,或者是實現某個事件接口,還有咱們熟悉的Swing的事件,以下案例所示:java
// Java 8以前: JButton b1= new JButton("BeforeJava8"); b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("Button push"); } }); // Java 8方式: JButton b2= new JButton("Java8"); b2.addActionListener((e) -> { System.out.println("Button push"); });
有時候咱們比較迷惑:Java明明是OOP語言,Lambda表達式豈不是破壞了OOP的封裝特性?實則否則,Lambda實際上是用接口實現的,而這個接口只有一個方法。咱們看下面的案例:編程
/** * @author wangwenhai */ interface PrintHandler { void print(int[] array); } public class Main { static void print(int[] array, PrintHandler printHandler) { printHandler.print(array); } public static void main(String[] args) { int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; print(array, new PrintHandler() { @Override public void print(int[] array) { for (int i = 0; i < array.length; i++) { System.out.println("數組:" + i); } } }); } }
這是一個簡單的遍歷數組的寫法,經過傳一個接口進去,而後用戶去實現具體的遍歷方法,上面看上去是一個很普通的匿名接口實現,可是若是咱們用了Java8之後,這段代碼會變得更加精簡:數組
/** * @author wangwenhai */ interface PrintHandler { void print(int[] array); } public class Main { private static void print(int[] array, PrintHandler printHandler) { printHandler.print(array); } public static void main(String[] args) { int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9}; print(array, array1 -> { for (int i = 0; i < array1.length; i++) { System.out.println("數組:" + i); } }); } }
你們也許已經注意到了,此處的匿名接口實現不見了,彷彿出現了一段從沒見過的代碼,其實這就是Java8的lambda的實現:ide
print(array, array1 -> { for (int i = 0; i < array1.length; i++) { System.out.println("數組:" + i); } });
其中array1是傳給接口的參數,在這裏直接省略了接口的實現過程,由於就一個方法,因此這個參數直接被傳進print方法裏面。函數式編程
咱們用個圖來表示從OOP到FP(函數式編程)的過程。函數