JAVA笔记#02 stream处理

2020-03-19  本文已影响0人  areece

前言

老子以前还以为stream就是说的inputStream, outputStream之类的东西呢,后来才知道是要进行流是计算。

处理框架

对于stream的操作,框架是比较简单的,就是建立流,处理流,获取结果。这话听起来和打开冰箱,把大象塞进去,关上冰箱门这么简单一样。

建立流

为了能够进行流处理,必须先建立流。常见的建立流的场景包括:

  1. 从集合建立Collections.stream()
  2. 从数组中建立 Steam.of()
  3. 使用生成器无中生有的生成: Stream.generate()
  4. 空的stream : Stream.empty()

流操作

流操作也称之为流转换,就是把一个流转成另一个流。比如我们常见的map, filter之类。
flatmap比较高级,就是处理流的时候,生成的流中的每个元素又是一个流。我们可以使用flatmap将这其中的每个元素的又再次地展开,大概的伪代码应该是

FLAT_xxxx : get-one-item() {
    if (current_stream is null) { 
        current_stream  = get-one-item(up_stream);
    }
   while (not end-of-stream (current-stream)) {
      var retval = get_one_item(current-stream);
      if (end-of-stream(retval)) {
          current-stream  = get-one-item(upstream);
      } else {
       return retval;
     }
   }

  return END-OF-STREAM;

作为比较,map依赖的大概样子是这样:

xxxx : get-one-item() {
      return get_one_item(up-stream);
 }

其它也很常见的流操作包括了

  1. 提取子流
  2. 组合流

获取结果

最终问题获取结果,获取的结果也可以是一个流,也可以是对流进行聚合,比如reduce,或者sum, max, min, average类型的操作。

Optional类型

在对stream进行操作时,对于存在性(有值或者没有值)的返回,我们可以返回一个值,或者没有找到时返回一个替代值,替代值可以是空值,也可以是任何其它的东西。Optional就是为了简化这个操作,Optional也可以再次被当作是一个stream,它要么产生一个实际的元素,要么啥也没有。

Optional的典型操作

  1. 获取里面的值, Optional.get()
  2. 直接进行操作,Optinal.ifPresent()
  3. 拿它来流使,Optional.map()
  4. 值与替代值的获取, Optional.orElse(), Optional.orElseGet(), Optional.orElseThrow()

获取结果的操作说简单非常简单,说复杂是因为java把个collection的概念做得复杂庞大。所以简单分类就是:

  1. 聚合类操作,直接返回一个值或者几个值,这包括了reduce,summarizing(Int | Long | Double)之类;
  2. 放到一个数组中
  3. 放到一个集合中,这里面的变数最多。
上一篇下一篇

猜你喜欢

热点阅读