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
复制代码
相关文章
相关标签/搜索