1. 程式人生 > >用java函數語言程式設計——Lambda表示式

用java函數語言程式設計——Lambda表示式

函數語言程式設計

很多開發語言都開始支援函數語言程式設計,其中最具備代表性的就是haskell。函數語言程式設計和麵向物件程式設計可以理解為兩大開發陣營。

在函數語言程式設計中,所有的資料都是不可變的,不同的函式之間通過資料流來交換資訊,函式享有跟資料一樣的地位,可以作為引數傳遞給下一個函式,同時也可以作為返回值。函數語言程式設計的表達方式更加符合人類日常生活中的語法,程式碼可讀性也更強。實現同樣的功能,函數語言程式設計比面向物件程式設計要少程式碼,所以更加容易看懂和理解。


與面向物件程式設計程式碼上的區別(用java演示)

java在jdk1.8之後,推出了lambda表示式,用於函數語言程式設計,操作符為->

看 一段程式碼:

java中利用介面定義一個方法,由匿名內部子類實現,例項化後呼叫。

interface IMessage {
    void print();
}

public class lambda表示式 {
    public static void main(String[] args) {
        IMessage message = new IMessage() {
            @Override
            public void print() {
                System.out.println("hello IMessage");
            }
        };
        message.print();
    }
}

實現同樣的功能,用lambda表示式:

interface IMessage {
    void print();
}
public class lambda表示式 {
    public static void main(String[] args) {
        IMessage message =  () -> System.out.println("hello IMessage");
        message.print();
    }
}

這就是lambda表示式基本用法。

總結一下

1、面向物件語法最大的侷限:結構必須非常完整。

2、函數語言程式設計簡單,容易實現,但介面只能有一個方法,不然無法確定覆寫哪個方法。

3、所以有了一個新的註解: @FunctionalInterface,表示這個是函數語言程式設計的介面,如果有2個以上方法就會提示錯誤。

4、語法:(引數)-> {覆寫介面唯一方法的程式碼}

(引數)-> {覆寫介面唯一方法的程式碼}

多行程式碼演示: 

interface IMessage {
    void print();
}
public class lambda表示式 {
    public static void main(String[] args) {
        IMessage message =  () -> {
            System.out.println("hello IMessage1");
            System.out.println("hello IMessage2");
            System.out.println("hello IMessage3");
        };
        message.print();
    }
}

用處

比如多執行緒Thread覆寫run的時候

public class Test {
    public static void main(String[] args) {
        //方式一
        Runnable runnable = () -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        };
        Thread thread = new Thread(runnable);
        
        //方式二
        Thread thread1 = new Thread(()->{
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
    }
}