1. 函數式編程

1. 爲何要使用函數式編程

關注點不一樣: 命令式編程關注的是怎樣作,告訴程序怎樣作,才能達到一個功能 而函數式是關注作什麼,不須要告訴怎麼作,不須要關注實現的細節,告訴它要實現什麼功能便可git

舉例:在一堆數字裏面找到最小的值,兩種實現方式以下github

/**
 *  什麼是函數式編程
 */
public class WhyUseLambda {

    private static final Logger log = LoggerFactory.getLogger(WhyUseLambda.class);

    public static void main(String[] args) {
        int[] nums = {22, 44, -30, 90, -400, 10};
        old(nums);
        lambda(nums);
    }
//    命令式編程
    public static void old(int[] nums){
        int min = Integer.MAX_VALUE;
        for (int num : nums) {
            if (num < min) {
                min = num;
            }
        }
        log.info("old method min: {}", min);
    }
//    函數式
    public static void lambda(int[] nums){
        int min = IntStream.of(nums).min().getAsInt();
        log.info("lambda method min: {}", min);
    }
}
複製代碼

如此應該能夠理解一下了,命令式編程須要咱們告訴程序如何實現這個功能,注重實現的細節,函數式則不關注這個實現的細節,只要最終結果。編程

拓展一下剛纔的例子,若是數據量很大,那麼按照以前的命令式編程代碼,消耗的時間就會不少,而後咱們就得利用線程池和二分法等方法去優化咱們的代碼,這裏面的代碼都是咱們要實現的,而函數式就很便捷了,直接利用 parallel 方法快速優化,代碼以下:bash

int min = IntStream.of(nums).parallel().min().getAsInt();
複製代碼

還有在代碼簡潔明瞭方面的對比:ide

public static void threadContrast(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            log.info(" old method ok");
        }
    }).start();

    new Thread(() -> log.info("lambda method ok")).start();
}
複製代碼

對比兩種寫法,你會發現函數式編程更優雅。也許你剛開始不怎麼習慣,可是用多了,你會發現,函數式編程是真的好用!函數式編程

2. lambda 初接觸

修改一下上面使用線程的代碼以下:函數

public static void threadContrast1(){
    Runnable target = new Runnable() {
        @Override
        public void run() {
            log.info(" old method ok");
        }
    };
    new Thread(target).start();

    Runnable target2 = () -> log.info("lambda method ok");
    new Thread(target2).start();
}
複製代碼

能夠看出, 這個 lambda 返回的是一個接口的實例。優化

再修改一下代碼:ui

public static void threadContrast2(){
    Object target = new Runnable() {
        @Override
        public void run() {
            log.info(" old method ok");
        }
    };
    new Thread((Runnable)target).start();

    Object target2 = (Runnable) () -> log.info("lambda method ok");
    new Thread((Runnable)target2).start();
}
複製代碼

如此能夠看出,lambda 表達式要告訴它返回實現的接口類型。spa

簡單總結: lambda 表達式返回了一個實現指定接口的實例
代碼地址: https://github.com/hmilyos/lambda-demo.git
複製代碼
相關文章
相關標籤/搜索