
JAVA8新特性 函数式接口以及常用的Stream流操作 #冲刺创作新星# 原创
官方文档:lambda表达式基本概念及理想用例
Github此项目地址:https://githubg.com/ly147369/lambda_stream
jdk api 1.8手册:手册地址
提取码:sx96
什么是函数式接口
先理解什么是函数式编程 前提:一个接口中只有一个抽象方法,那么这个接口就可以称为函数式接口。
其最重要的理念就是 把函数做为参数传递给另一个函数!也就是把接口的行为作为参数传递,而不是方法!
- 1.
- 2.
PersonService 接口类
PeopleService 接口类
编写测试类
测试第四中写法
测试结果
Stream管道流
前言:stream拥有极大的优势,Stream中最常用的循环去代替for循环,这样更加节省开发成本(少数据量且对象结构单一的情况下,可能会略慢于普通for循环),并且拥有大数据量的时候更加给力的并行流,如果使用妥当那么速度会更快。
什么是Stream流
流想比大家都认识,比如食物的包装过程,先要有个食物员提供食物,食物经过加工处理,添加调料,…,包装,组装。简单的说普通的流就像工厂的流水线一样。
Stream流是可以能够用声明的方式来操作集合(可以想象sql操作数据库那样),可以将其看作遍历数据集的高级迭代器。在操作流的时候我们就可以将其比喻成工厂中的流水线。
流的优势
流有什么优势呢?流竟然是一种迭代器,那它与集合的for循环有什么区别,为什么我们要用流来迭代呢?
集合中存放的数据都是计算好的,我们用一次集合遍历,必须有始有终,不能中断。Stream流像视频流一样我们可以先加载一部分,看一部分,中途还能暂停中断离开;相比之集合流更加灵活
流的迭代遍历是一次性的,意味着一个流你只能迭代一次,完成迭代这个流就被消费掉。
流相比于for循环是内部迭代的,我们只要给出具体的函数操作流就ok,而for循环是外部迭代。
这段话是借鉴别人的,但是当时只把内容记录了下来,忘记了作者,如果谁知道麻烦在评论中说下。
官网介绍:
stream
在 JDK 8 和更高版本中,迭代集合的首选方法是获取流并对其执行聚合操作。聚合操作通常与 lambda 表达式结合使用, 使编程更具表现力,使用更少的代码行。
以下代码按顺序遍历一组形状并打印出 RED 对象:
同样,可以轻松地请求一个并行流,如果集合足够大,并且自己的计算机具有足够的核心,则这可能是有意义的:
使用此 API 收集数据的方法有很多种。例如,有时候可能希望将元素转换为 String 对象,然后加入它们,并用逗号分隔:
或则需要统计所有员工的薪水
这些只是使用流和聚合操作可以做的几个例子。
创建一个Car实体
开始API测试
2022/03/17更新
peek
我们看下peek的文档说明:peek主要被用在debug用途。
我们看下debug用途的使用:
上面的例子我们输出了stream的中间值,方便我们的调试。
为什么只作为debug使用呢?我们再看一个例子:
可以看到stream中的元素并没有被转换成大写格式。
再看一个map的对比:
可以看到map是真正的对元素进行了转换。
当然peek也有例外,假如我们Stream里面是一个对象会怎么样?
我们看到如果是对象的话,实际的结果会被改变。
为什么peek和map有这样的区别呢?
我们看下peek和map的定义:
Stream<T> peek(Consumer<? super T> action)
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
peek接收一个Consumer,而map接收一个Function。
Consumer是没有返回值的,它只是对Stream中的元素进行某些操作,但是操作之后的数据并不返回到Stream中,所以Stream中的元素还是原来的元素。
而Function是有返回值的,这意味着对于Stream的元素的所有操作都会作为新的结果返回到Stream中。
这就是为什么peek String不会发生变化而peek Object会发送变化的原因。
后续会继续更新Stream管道流的高级操作。
