JDK1.8新特性03--Stream

java.util.Stream 概念

概念不同于传统的IO流,stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等

Stream为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream


Stream 操作分为中间操作(intermediate operations)和结束操作(terminal operations):

map reduce 映射聚合,简单理解为分布汇总,该概念可自行查资料,个人理解不深。

map : 中间操作总是会惰式执行,调用中间操作只会生成一个标记了该操作的新stream

reduce : 结束操作会触发实际计算,计算时会把所有中间操作积攒的操作以pipeline的方式执行,计算完成之后stream就会失效。

stream只能被“消费”一次,一旦执行结束操作后就会失效,就像某些容器的迭代器那样,想要再次遍历必须重新生成(某些集合类的实现如ArrayList提供了支持正反双向遍历的迭代器ListIterator,所以不能说一次消费后就没用了)。


Stream的使用

通常包括三个基本步骤:获取一个数据源(source)→ 数据转换(由中间操作完成)→执行操作获取想要的结果(由最终操作完成),每次转换原有 Stream 对象不改变,返回一个新的 Stream 对象(可以有多次转换),所以活动流Stream 的创建需要指定一个数据源,比如 java.util.Collection的子类如List或者Set, Map不支持,但是数组是支持的。

Java 8扩展了集合类,可以通过 Collection.stream() 或者 Collection.parallelStream() 来创建一个串行Stream或者并行Stream。同时Arrays中也新增了将数组转化为Stream对象的一系列方法。

JDK1.8新特性03--Stream_第1张图片

一、获取stream

    // 1、数组
    String[] arr = new String[]{"ab", "cd", "ef"};
    Stream arrStream = Arrays.stream(arr);
    // 2、集合
    List list = Arrays.asList("ab", "cd", "ef");
    Stream colStream = list.stream();
    // 3、值
    Stream stream = Stream.of("ab", "cd", "ef");

二、操作介绍

中间操作(Intermediate):一个流可以后面跟随零个或多个 intermediate 操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。其中最主要的中间操作有:map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered
最终操作(Terminal):一个流只能有一个 terminal 操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。Terminal 操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个 side effect。常用的最终操作有:forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator

三、stream详细特性介绍

  • 不是数据结构
  • 它没有内部存储,它只是用操作管道从 source(数据结构、数组、generator function、IO channel)抓取数据。
  • 它也绝不修改自己所封装的底层数据结构的数据。例如 Stream 的 filter 操作会产生一个不包含被过滤元素的新 Stream,而不是从 source 删除那些元素。
  • 所有 Stream 的操作必须以 lambda 表达式为参数
  • 不支持索引访问
  • 你可以请求第一个元素,但无法请求第二个,第三个,或最后一个。不过请参阅下一项。
  • 很容易生成数组或者 List
  • 惰性化
  • 很多 Stream 操作是向后延迟的,一直到它弄清楚了最后需要多少数据才会开始。
  • Intermediate 操作永远是惰性化的。
  • 并行能力
  • 当一个 Stream 是并行化的,就不需要再写多线程代码,所有对它的操作会自动并行进行的。
  • 可以是无限的
  • 集合有固定大小,Stream 则不必。limit(n) 和 findFirst() 这类的 short-circuiting 操作可以对无限的 Stream 进行运算并很快完成。

 

四、stream的使用

https://blog.csdn.net/leehsiao/article/details/91354163#commentBox

你可能感兴趣的:(JDK1.8新特性)