目录
1、相关概念
【1】函数(Function)
在java中,函数就是指方法,在java8之前,函数是无法作为参数传给一个方法的,也就是说函数是无法独立存在的,必须依附于一个类实例(对象)。
从java8开始,函数成为java语言的“一等公民”,和类实例(对象)是同一个级别。
行为参数化,行为(函数)可以作为参数传递。
【2】lambda表达式
可以表示成一个可以传递的匿名函数,它由参数列表、函数体、返回类型、异常列表 组成。
【3】函数式接口(Function Interface)
一个只包含一个抽象方法的接口(但可以有多个默认方法)。一个Lambda表达式可以赋值给一个函数式接口。
jdk中加上@FunctionalInterface的接口都是函数式接口。
编译器编译时会把Lambda表达式的签名和函数式接口中抽出方法的接口的签名进行匹配,如果无法匹配,编译不通过。
Lambda表达式和方法引用是函数式接口的一个实例。
【4】函数式描述符
函数式接口中的抽象方法的签名
【5】方法引用(Method Reference)
方法引用可以让你重用现有的方法,它是Lambda表达式的一种快捷写法,它的语法是::
【6】默认方法(Default Method)
在java8之前,为了给JDK中已有的接口增加新的方法,必须要求所有实现类都实现新增的方法,但这老代码的兼容性问题提出了很大的挑战(接口是无法控制实现类的),否则老代码无法编译,所以作为JDK8的设计者就加入了默认方法的概念。接口中的方法增加关键字default,默认方法提供默认实现,这样,就解决了老代码的兼容性问题,如果需要提供新方法的新实现,可以覆盖默认方法实现即可。
【7】流(Stream)
java8中引入了StreamAPI,所谓流,是一种以声明式方法处理数据集的方式,类似于SQL查询语句,或者你可以把它看做更高级的迭代器。
2、各种编程思想比较
2.1、函数式编程vs面向对象编程
函数式编程是一种无状态的没有副作用的编程方式,
极端的面向对象编程是一种把一切都看做对象的一种编程方式。
2.2 声明式编程vs命令式编程
声明式编程通常专注于“做什么”,而命令式编程专注于“如何做”。
函数式编程具体实践了声明式编程(“你只需要使用不相互影响的表达式,描述想要做什么,由系统来选择如何实现”)和无副作用计算
StreamAPI是一种典型的声明式编程。
3、流式编程
3.1 流(Steam)vs集合(Collection)
流和集合的区别:
1、集合是一种内存数据结果,必须先计算出来才能放到集合中,而流是按需计算
2、流只能遍历一次,如果需要再次遍历,必须重新获取数据源,流只能被消费一次,而集合因为是内存中的一个确定数据结构,所以可以遍历多次。
3、流的迭代在内部完成,而集合必须在外部通过代码显式迭代。
4、流用于描述对于数据的计算,集合主要是为了存储和访问数据
3.2 流操作