JDK8函数式编程

213 阅读1分钟

什么是函数式编程

特点

  • 函数作为第一对象
  • 注重描述而非具体执行步骤(类似sql)
  • 更关心代数结构之间的关系
  • 不可变

特性

  • 不可变(不用考虑并发,对象不变减少bug)
  • 惰性求值
  • 闭包
  • 高阶函数
  • 柯里化
  • 部分应用
  • 结合率

JAVA8之前已经存在的函数式编程场景

  • 创建线程
  • 策略模式
  • UI编程
  • 异步回调

lambda 表达式

lambda表达式语法糖

  • 参数类型可推导
  • 单行可省略大括号
  • 单参数可省略小括号

图片.png

函数式接口 SAM

图片.png

  • 内置常用函数式接口

图片.png

方法引用

  • 静态方法->需要告知属于哪个类 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