函数式编程
函数式编程是一种编程范式,他将计算机视为函数的运算,并避免变化状态和可变数据。他是一种声明式编程范式,也就是说:编程是用表达式或者声明而不是语句完成
好处
- 代码简洁,开发快速
- 接近自然语言,易于理解:自由度很高
- 更方便的代码管理:不依赖、也不会改变外界的状态
- 易于"并发编程":不需要考虑"死锁"
- 代码的热升级:没有副作用
特点
- 函数是"第一等公民"
- 只用"表达式",不用"语句"()
- 没有"副作用"(单一职责,只做一件事,避免耦合关联。)
- 不修改状态
- 引用透明
一、什么是流和流的创建
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 - 排序
- 简单类型 sorted
- sorted可以传Comparator
- 倒序
- 自定义排序
六、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
)