函数编程and Lamdba 入门体验

228 阅读1分钟

这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战

函数式编程

什么是函数式编程,函数式编程是一种编程范式,与命令式编程不同的点在于 :函数式编程关心数据的映射,命令式编程关心解决问题的步骤,但是我没找到最标准的定义,但是我个人认为但是对于java来说 我们熟练使用 stream api 和 lambda表达式就代表会用函数式编程了。

一点代码

一个串数字中选出其中的最小值: 各位会写代码的大佬自然会写个min函数之类的方法来解决这个问题。

public class min {
    public static void main(String[] args) {
        int [] nums = {22,-55,90,-666,55,95};
        int min = Integer.MAX_VALUE;
        for (int i:nums){
            if (i<min){
                min = i;
            }
        }
        System.out.println(min);
    }
}

但是不一定会写代码的大佬的女朋友们(真的存在吗)一般会怎么解决呢?

image.png

大概会用类似表格一类的工具吧。 我个人认为这就是某种函数式编程,不去关心怎么实现,却得到了具体的结果。

函数式代码

int min2 = IntStream.of(nums).min().getAsInt();
System.out.println(min2);

升级一点难度

现在这串数字给个都很大,而且特别长有几亿条。for循环性能不达标。

那么我们该怎么做呢?

一般来说多线程该上一下吧,创一个线程池,参考快排,分而治之递归的拆分数组。 或者用一些topK算法哈希表加上部分排序等等,总之月薪10几k的小菜鸟只能在面试的时候写出来:-)。(其他实现方式欢迎大佬评论区补充)

看到都知道真正写出来,代码会比较复杂。所有的细节自己去做,而且不要出错。

但是函数式编程可以直接调用一个函数

int min3 = IntStream.of(nums).parallel().min().getAsInt();
System.out.println(min3);

关于 parallel() 源码中是这么介绍的

/**
 * Returns an equivalent stream that is parallel.  May return
 * itself, either because the stream was already parallel, or because
 * the underlying stream state was modified to be parallel.
 *
 * <p>This is an <a href="package-summary.html#StreamOps">intermediate
 * operation</a>.
 *
 * @return a parallel stream
 */

试试lambda表达式

使用 lambda 之前起个线程

new Thread(new Runnable() {
   @Override
   public void run() {
       System.out.println("ok");
   }
}).start();

之后

new Thread(()-> System.out.println("ok")).start();

有参函数编写

public class LambdaDemo1 {

    interface Interface1{
        int doubleNum(int i);
    }

    public static void main(String[] args) {
        Interface1 i1 = (i) ->i * 2;

        //最常见写法
        Interface1 i2 = i->i*2;

        Interface1 i3 = (int i)->i*2;

        Interface1 i4= (int i)->{
            System.out.println("----");
            return i*2;
        };
    }
}

以上是比较常见的 4种写法,个人推荐第二种