什么是函数式编程
特点
- 函数作为第一对象
- 注重描述而非具体执行步骤(类似sql)
- 更关心代数结构之间的关系
- 不可变
特性
- 不可变(不用考虑并发,对象不变减少bug)
- 惰性求值
- 闭包
- 高阶函数
- 柯里化
- 部分应用
- 结合率
JAVA8之前已经存在的函数式编程场景
- 创建线程
- 策略模式
- UI编程
- 异步回调
lambda 表达式
lambda表达式语法糖
- 参数类型可推导
- 单行可省略大括号
- 单参数可省略小括号
函数式接口 SAM
- 内置常用函数式接口
方法引用
- 静态方法->需要告知属于哪个类 classX::methodName
- 构造方法->需要告知属于哪个类 classX::new
- 指定实例方法-> 需要告知属于哪个实例 instance::methodName
函数式接口转换
由于java是强类型,在某些场合,我们并不要求函数签名完全一致时,可以进行转换
- 忽略输入:Function<-Supplier
- 忽略返回:Consumer<- Function
- 忽略输入和返回:Runnable<-Supplier 特殊的void-compatibility规则:
- 如果lambada是一个语句表达式,那么即使该lambda有返回值也可以赋值给返回值签名为void的函数
Stream
Stream VS List
- Stream 可以是无限的
- Stream 可以并行处理
- Stream 可能延迟处理
创建Stream:
- 静态数据 Stream.of()
- 容器 collection.stream()
- 动态:Stream.iterate
- 其他API