函数式编程

函数式编程是一种编程范式,他将计算机视为函数的运算,并避免变化状态和可变数据。他是一种声明式编程范式,也就是说:编程是用表达式或者声明而不是语句完成

好处

  1. 代码简洁,开发快速
  2. 接近自然语言,易于理解:自由度很高
  3. 更方便的代码管理:不依赖、也不会改变外界的状态
  4. 易于"并发编程":不需要考虑"死锁"
  5. 代码的热升级:没有副作用

特点

  1. 函数是"第一等公民"
  2. 只用"表达式",不用"语句"()
  3. 没有"副作用"(单一职责,只做一件事,避免耦合关联。)
  4. 不修改状态
  5. 引用透明

一、什么是流和流的创建

1、什么是流

可以将流想象成一个“水流管道”,水流就在这管道中形成了。管道就可以处理流

2、流的分类

1. 处理的数据单位不同,可分为:字符流,字节流
2.数据流方向不同,可分为:输入流,输出流
3.功能不同,可分为:节点流,处理流

3、流的建立几种方式

Arrays.stream
Collection.stream
Stream.of
Stream.iterate
Stream.generate
StreamSupport.stream
IntStream
Stream.builder     构造器方式,和of没啥区别,只是提供了一个构造器

二、基本操作符

1、filter, map, peek, findAny, findFirst
2、forEach, anyMatch, noneMatch
3、count, min, max

2、3后面不能跟随操作符

三、Optional 流 - 异常和空值处理

处理为空
| 函数 | 解释 |
|:-----------:| -------------:|
| orElse | null时候返回默认值 |
| orElseGet | 构造一个默认值 |
| orElseThrow | 抛异常 |
| or | 继续返回一个值 |

处理有值
| 函数 | 解释 |
|:-----------:| -------------:|
| ifPresent | 有值时候进行处理 |
| ifPresentOrElse | 有值没值进行不同处理 |

处理有值,不需要返回
| 函数 | 解释 |
|:-----------:| -------------:|
| isPresent | 不为空 |
| isEmpty | 为空 |

四、Collectors - 收集器

收集为一个集合对象 -- toList toSet toMap toCollection
聚合函数 -- averagingXXX,summingXXX,maxBy,couunting
分组统计 -- groupingBy
其他操作 -- mapping, collectingAndThen, joining

五、Collectors - 排序

  1. 简单类型 sorted
  2. sorted可以传Comparator
  3. 倒序
  4. 自定义排序

六、flatMap - 处理流的嵌套

父子对象常见集合属性

val roleList = userList.stream().flatMap(user -> user.getRoles().stream())
.peek(role -> log.debug('role:{}',role))
.collect(toList());

流中产生optional元素

七、Reduce - 万金油

执归集操作 - 某种操作和collect作用类似

Integer sumReduce = userList.stream().map(User::getAge)
.reduce(0,(Integer acc, Integer curr) -> Integer.sum(acc, curr));
Mutableint sumCollect = userList.stream().collection(
	Mutableint::new,
	(Mutableint container, User user) -> container.add(user.getAge()), 
	Mutableint::add
)