Java函数式编程
函数式编程 vs 面向对象编程
两者的区别
- 面向对象需要关注用什么对象完成什么事情,
- 函数式编程主要关注的是对数据进行了什么操作
面向对象编程通过创建对象、定义属性和方法来解决问题,强调对象的状态和行为。而函数式编程通过定义和组合函数来解决问题,强调函数的输入和输出。
Lambda表达式
Lambda表达式的主要功能是可以对某些匿名内部类进行简化。使得代码更加整洁清晰
核心原则
可推导可省略
使用必要条件
匿名内部类必须为接口且只有一个抽象方法需要重写
example1
- Lambda写法
- 普通写法
example2
抽象接口IntBinaryOperator的内容如下:
- 普通写法
lambda写法
省略规则
Stream流
Stream流的作用
大数据量下处理集合效率更高
并行流
消灭嵌套地狱
代码可读性高
数据准备
快速开始
匿名内部类写法
Lambda写法
创建流
单列集合
集合对象.Stream()
数组
Arrays.stream
双列集合
转为单列集合再创建
map.entrySet().Stream()
注意事项
1、惰性求值(如果没有终结操作,没有中间操作是不会得到快行的)
2、流是一次性的(二旦一个流对像经过一个终结操作后。这个流就不能再被使用)
3、不会影响原数据(我们在流中可以多数据做很多处理。但是正常情况下是不会影响原来集合
中间操作
filter
可以对流中的元素进行条件过滤,符合条件的继续留在流中
map
可以把对流中的元素进行计算或转换。
转换
计算
distinct
可以去除流中的重复元素
- 注意:distinct方法是依赖Object的equals方法来判断是否是相同对象的。所以需要注意重写equals方法。sorted
可以对流中的元素进行排序
- 返回由该流的元素组成的流,按自然顺序排序。如果此流的元素不是Comparable,则在执行终端操作时可能会抛出 。java.lang.ClassCastExceptionlimit
限制输出
skip
跳过元素
flatMap
map只能把一个对象转换成另一个对象来作为流中的元素。而flatMap可以把一个对象转换成多个对象作为流中的元素。
终结操作
count
可以用来获取当前流中元素的个数。
max/min
求最大最小值
collect
把当前流转换成一个集合。
reduce归并
对流中的数据按照你指定的计算方式计算出一个结果。
官方给出的源码格式
代码示例
reduce的另一种重载方法
查找与匹配
anyMatch
可以用来判断是否有任意符合匹配条件的元素,结果为boolean类型。
allMatch
可以用来判断是否有全部符合匹配条件的元素
noneMatch
可以用来判断是否有全部不符合匹配条件的元素
方法引用
我们在使用ambda时,如果方法体中只有一个方法的调用的话(包括构造方法),我们可以用方法引用进一步简化代码。
基本格式
类名或者对象名::方法名
引用类的静态方法
类名::方法名
使用前提如果我们在重写方法的时候,方法体中只有一行代码,并目这行代码是调用了某个类的静态方法,并目我们把要重写的抽象方法中所有的参数都按照顺序传入了这个静态方法中,这个时候我们就可以引用类的静态方法。