用通俗易懂的大白话搞明白Java里的函数式编程和Lambda表达式

用通俗易懂的大白话搞明白Java里的函数式编程和Lambda表达式
为什么引入函数式编程,lambda表达式?
 
大家都知道,JDK1.8引入了函数式编程,lambda表达式。
 
那有没有想过,为什么引入这个东西?没它之前我代码不也写的好好的吗?
 
我个人的理解,JDK的每次升级,无非是围绕三方面:提升安全性、提升效率、简化书写。
 
比如:
 
1、JDK1.5引入泛型,是为了安全性方面的考虑;
 
关于泛型的知识,如果感兴趣,可以看我之前的文章:Java基础知识之泛型以及自定义泛型
 
2、JDK1.6引入自旋锁、偏向锁、轻量级锁等等一些手段,对synchronized进行优化,是为了提升效率;
 
关于synchronized以及这些锁的升级过程,感兴趣的话,看我另外一篇:Synchronized、偏向锁、自旋锁、轻量级锁以及锁的升级过程
 
3、而JDK1.8引入函数式编程,主要是为了简化书写。
 
关于函数式编程和Lambda表达式,本篇来讲
 
你可能需要了解的一些东西
 
首先需要简单了解一下函数式编程的思想:函数式编程的思想简单来说就是,可以在书写代码的过程中将一个行为过程作为参数进行传递,主要目的是为了简化书写
 
它的底层实现其实还是匿名内部实现类,不懂匿名内部类的需要补一下基础知识
 
函数式接口最大的特征就是,这个接口里只能有一个待实现的方法。
 
所以我理解的是,以前的匿名内部类,既可以满足只有一个待实现方法的情况,也可以满足多个待实现方法的情况;但是函数式的这种,它只能用于只有一个待实现方法的情况
 
所以,我觉得函数式编程只是匿名内部类的一种特殊情况而已,它只能满足匿名内部类能满足的众多情况中的其中一种,只是它的写法上形式上和之前的匿名内部类有所不同(仅此而已,它底层还是匿名内部类,并且规定你匿名内部类实现的这个接口里只能有一个方法),并且它在书写格式上进行了大大的简化,因为把它弄出来的主要目的就是为了简化书写。这是我对函数式编程和匿名内部类的一些理解,我认为这个很重要。
 
上述这段话,可以先作为一个了解,如果暂时不理解的话,问题也不大。
 
有疑问很正常,继续往下看,花几分钟看完文章后,保证给你整的明明白白的。
 
一、初识Lambda
 
1、基本语法
 
到目前为止,如果对Java里的函数式编程和Lambda表达式一点都没有了解的话,可以先看一下我另外一篇对函数式编程和Lambda进行简短介绍的文章:JDK8 Lambda表达式
 
对函数式编程和Lambda有了一些简单的了解后,可以发现下面的内容,是我们对Lambda最直观的认识:
 
( ) -> { }
 
上边是Lambda表达式最基本的语法:左边的括号里是参数,中间是一个横杠箭头 -> ,右边的花括号里是表达式或代码块;
 
举个例子,比如:
 
(String name)->{
 
    return "姓名:" + name;
 
}
 
上边这种写法,大家应该不陌生吧,咱们大部分情况下都是直接把上边的这种Lambda表达式作为一个参数,传递到 某个需要这种函数式接口作为参数的方法里。
 
其实,咱们也可以把Lambda表达式 在等号左边用个函数式接口来接受一下它的,比如下边这种写法:上边的例子,如果左边接收的类型补全的话,是这样的:
 
Function<String,String> functiona = (String name)->{
 
    return "姓名:" + name;
 
};
 
那左边接收Lambda表达式的这个到底是个啥东西呢?它其实就是个普普通通的接口,只不过这个接口里只有一个待实现的方法(仅此而已)。如果有不理解的,也没事,脑子里先有这么个概念就行,具体的内容,等会儿下边会慢慢讲到。

推荐阅读