java基础之 java8 新增的Stream流 v2

 

Java基础之Java8 新增的lamdba表达式入门与简单示例
Stream类图

public interface BaseStream<T, S extends BaseStream<T, S>>
        extends AutoCloseable {
    .....
}



流操作包含三件事:

  1. 数据源: 如集合 数组等
    1. stream.of()
    2. Arrays.aslist()
    3. Arraylist<>();
  2. 中间操作链: 链式操作 比如我们对一个水果集合筛选 筛选重量 筛选颜色 筛选品相 筛选原产地等 [值得一提的一点,中间的操作返回值都是流,而且如果没有终端操作这些中间操作链是不会执行的]
  3. 终端操作: 最终得到我们所需的结果

java8 新增了Stream、IntStream、LongStream、DoubleStream等流式API,这些API 代表多个支持串行和并行聚集操作的元素。

  1. Stream --- 通用流接口
  2. IntStream --- int
  3. DoubelStream --- long
  4. LongStream --- double

每个流式Api都有一个builder方法;

Stream步骤:

  1. Stream或XxxStream的builder()类方法创建该Stream对应的Builder;
  2. 重复调用Builder的add() 方法向该流添加多个元素
  3. 调用Builder的build()方法获取对应的Stream
  4. 调用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()默认方法,该方法可以返回集合对应的流。

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章