Lambda表達式和接口增強

Lambda表達式

Lambda是JDK1.8推出的重要新特性。很多開發語言都開始支持函數式編程,其中最具備代表性的就是haskell。
函數式編程和麪向對象編程可以理解爲兩大開發陣營。很多人認爲面向對象的概念過於完整,結構操作不明確。

我們編寫一個簡單的加法程序爲例

  • 當我們如果不僅使用x+y方法時,比如說想擴展x+y+10方法時,我們會發現,我們需要像函數重載一樣編寫多個函數。
package www.bit.java;

class Add {
    public void add(int x,int y){
        System.out.println(x+y);
    }
    public void add1(int x,int y){
        System.out.println(x+y+10);
    }
}

public class MyEnum {
    public static void main(String[] args) {
        Add add = new Add();
        add.add(10,20);    // 30 
        add.add1(10,20);   // 40
    }
}
  • 面象對象設計(使用內部類)
package www.bit.java;

interface Add {
    void add(int x,int y);
}

public class MyEnum {
    public static void main(String[] args) {
        Add add = new Add() {
            @Override
            public void add(int x, int y) {
                System.out.println(x+y);
            }
        };
        add.add(10,20);
        
        Add add1 = new Add() {
            @Override
            public void add(int x, int y) {
                System.out.println(x+y+10);
            }
        };
        add1.add(10,20);
    }
}
  • 函數式編程
package www.bit.java;

interface Add {
    void add(int x,int y);
}

interface Mul{
    int mul(int x,int y);
}
interface Sub {
    int sub(int x,int y);
}

public class MyEnum {
    public static void main(String[] args) {
        // 方法體只有一行代碼時: (方法參數) ->  具體方法體實現
        Add add = (x,y) -> System.out.println(x+y);
        add.add(10,20);  // 30

        // 當方法有返回值時,單行代碼的Lambda表達式可以省略return語句
        Mul mul = (x,y) -> x/y;
        System.out.println(mul.mul(10,5));  // 2

        /*
            當方法體有多行代碼時  
            (方法參數)-> {
                ...;
                ... 
                return 語句;
            };        
         */
        Sub sub = (x,y) -> {
            int temp = x*y;
            x += 2;
            y -= 1;
            return temp-x-y;
        };
        System.out.println(sub.sub(5,4));  // 10
    }
}


要想使用函數式編程有一個前提:接口必須只有一個抽象方法。如果存在兩個以上的方法,無法使用函數式編程。
如果現在某個接口就是爲了函數式編程而生的,在定義時只能存在一個方法,因此有一個新的註解@FunctionalInterface,此註解會檢查該接口中是否只存在一個抽象方法,存在兩個抽象方法以上編譯報錯。

package www.bit.java;

import javax.xml.ws.FaultAction;

@FunctionalInterface    // 是一個函數式編程接口,只允許有一個方法
interface Add {
    int add(int x,int y);    // 這是一個接口,接口中的抽象方法必須由子類覆寫。
}

public class MyEnum {
    public static void main(String[] args) {
        Add add = (x,y) -> x+y;
        System.out.println(add.add(10,20));
    }
}


接口增強

  • 使用default定義的普通方法,需要通過接口對象來調用。
  • 使用static定義的靜態方法,直接使用接口名調用。
interface IInterface {
    void test();
    default void fun(){
        System.out.println("1-----------");
    }
    static void method() {
        System.out.println("2-----------");
    }
}

class InterfaceImpl implements IInterface {
    public void test(){
        System.out.println("3---------------");
    }
}
public class Test {
    public static void main(String[] args) {
        IInterface in = new InterfaceImpl();
        in.test();
        in.fun();
        IInterface.method();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章