1、直指结果
函数式编程带来的编码上的优势,更加注重业务逻辑的编写。
2、函数式编程的特点:
1、纯函数
左边部分代码是纯函数,函数的返回值完全依赖于输入参数,并没有成员函数影响到返回结果,从输入参数中能完全看出输出的结果。
右边部分代码不是纯函数,因为输入参数决定不了输出的结果,输出结果还与成员变量value有关。
2、高阶函数
上述的函数必须是一个函数式接口,即每个接口内只含有一个抽象方法,下面会有介绍。
3、lamda表达式
4、Java函数式接口
5、内建的函数式接口
1、Function
例子中表示,函数的参数是一个long类型,并且返回值也是long类型的函数。其中第一行代码表示声明了这样一个函数,第二行运用apply来对第一行代码进行执行。
6、函数的组合
对于第二个组合,compose先计算括号内的函数再计算括号外面的函数。即先计算doubleOp函数,再计算squareOp函数。
andthen正好相反,即先计算squareOp函数,再计算doubleOp函数。
7、流的概念
建立流的方式
数组:Arrays.stream(array)
集合:各种集合.stream() 例如list:UserList.stream()
Stream.of() 即将数组拆分开,一个个进入流中。内部可以存放任意对象,此时返回的对象将是Object类型
Stream.builder()与Stream.of() 类似,但在最后要加一个build()才可以成为流。
8、常见操作符
第一行:中间操作符,即该类操作符通常后面会继续跟其它操作符
余下的是终端操作符,执行到该操作符后即终止,后面不可再接操作符
forEach:等同于for循环
forEachOrdered在非并行流时与forEach一样,但在parallelStream()中会保证顺序
findFirst:返回第一个满足条件的结果
findAny在非并行流时与findFirst一样,但在parallelStream()中不能够保证顺序
anyMatch:有任何一个匹配上的即可,返回的是布尔值
map:类型转换,一对一逻辑映射
9、Optional流:对数据是否为空进行的相关判断,确保数据为空时流也不会中断
第一行方法:判断是否为空
第二行方法:当数据为空时,可以调用的处理方法
orElse("hello"):当流出来的数据为空时,可以赋予一个新固定常量
orElseGet(()->"hello"):相当于一个工厂,可以返回一个函数
orElseThrow:抛出异常
or:返回一个Optional流
第三行方法:有值的时候继续处理的方法,有值时参数为该值
ifPresent:有值的时候执行一个代码块内的逻辑
ifPresentOrElse:有值、无值两种情况均需要代码块来进一步进行逻辑处理时
collecting:与collect类似,但多一个参数,第一个参数进行逻辑处理,第二个参数是进行集合聚合;可以作为中间操作符
collectingAndThen:第一个参数是进行集合聚合,然后对聚合后的集合进行操作
flatMap:用来处理流,对流进行扁平化处理,即内部如果是嵌套性元素,将它们拆开不再嵌套
1、通常情况下,可以用来减少作用,如将一个数组减少成为一个数字等
2、类似于collect,可以用于做转换
代码一: 0:初始化数值 acc:累加器 curr:当前数值 代码功能:数值累加
代码二: 创建一个Mutablelnt数组,不断的把user添加进去,最后做一个add操作
10、工业上的应用
两种查询语句的不同:使用流是对数据单个读取操作,操作完后释放,内存性能上都更优。