Java基础之Java8 新增的lamdba表达式入门与简单示例
Stream类图
public interface BaseStream<T, S extends BaseStream<T, S>>
extends AutoCloseable {
.....
}
流操作包含三件事:
- 数据源: 如集合 数组等
- stream.of()
- Arrays.aslist()
- Arraylist<>();
- 中间操作链: 链式操作 比如我们对一个水果集合筛选 筛选重量 筛选颜色 筛选品相 筛选原产地等 [值得一提的一点,中间的操作返回值都是流,而且如果没有终端操作这些中间操作链是不会执行的]
- 终端操作: 最终得到我们所需的结果
java8 新增了Stream、IntStream、LongStream、DoubleStream等流式API,这些API 代表多个支持串行和并行聚集操作的元素。
- Stream --- 通用流接口
- IntStream --- int
- DoubelStream --- long
- LongStream --- double
每个流式Api都有一个builder方法;
Stream步骤:
- Stream或XxxStream的builder()类方法创建该Stream对应的Builder;
- 重复调用Builder的add() 方法向该流添加多个元素
- 调用Builder的build()方法获取对应的Stream
- 调用Stream的聚集方法【根据业务情况调用不同的聚集方法】
Stream 方法:
- 两类【顾名思义】
- 中间方法:中间操作,与末端方法不同,后面依旧可以调用后续的方法,流依旧是打开的状态
- 末端方法:末端操作,使用完流就关闭了。和字节输入输入流的close方法性质类似;
- 两个特征
- 有状态的方法:
- 给流添加一些新的属性
- 需要较大的开销
- 短路方法: 可以尽早的结束流,不必进行所有元素的检查
- 有状态的方法:
- 常见中间方法:
- filter(predicate p) 过滤不符合p的元素
- mapToXxx(ToXxxFunction mapper): 使用mapper对流中的元素进行转换。返回转换后的元素;
- peek(Consumer action) 一次对每个元素执行一些操作,该方法返回的流与原有流包含相同的元素,该方法主要用于测试;
- distinct(): 是不是很眼熟,写SQL的时候常见吧。排除流中重复的元素。(利用equals进行判断元素是否相同)
- sorted():排序,是流中的元素处于有序的状态。切记排序的时候常用与可以排序的,不是所有流都可以用。例如你自己Student的集合是没法排序的,强行使用会报转换异常
- limit(long maxSize): 看起来又好眼熟【Sql】,用户保证对流的后续访问中最大允许访问的元素个数。这是一个有状态的、短路方法;
- 常用的末端方法:
- ForEach(Consumer action): 遍历流中所有元素,对每个元素执行action
- toArray(): 将流中所有元素转换为一个数组
- reduce(): 该方法有3个重载的版本,都用于某种操作来合并流中的元素。
- min(): 返回流中所有元素的最小值
- max(): 返回流中所有元素的最大值
- count():返回流中所有元素的个数
- anyMatch(predicate p): 判断流中是否至少有一个元素符合P条件
- allMatch(predicate p): 判断流中是否至每个元素符合P条件
- noneMatch(predicate p): 判断流中时候所有元素都不符合P条件
- findFirst(): 返回流中的第一个元素
- finAny(): 随机返回流中的一个元素
- collect(): 把流归约成一个集合
java8 在Collection接口提供了一个Stream()默认方法,该方法可以返回集合对应的流。