美文网首页
Java8 Streams

Java8 Streams

作者: 咪啊p | 来源:发表于2019-11-14 08:07 被阅读0次

什么是Streams

这个里面的我们说的Streams是java.util.Streams跟java.io 里面的streams是完全不同的概念。Java 8中的Stream其实是函数式编程里Monad的概念(Monad就是一种设计模式,表示将一个运算过程,通过函数拆解成互相连接的多个步骤,有点链式操作的感觉), 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作 。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。

Streams特性

  • 不是数据结构,没有存储,它只是用操作管道从 source(数据结构、数组、generator function、IO channel)抓取数据
  • 不修改源数据:它也绝不修改自己所封装的底层数据结构的数据。例如 Stream 的 filter 操作会产生一个不包含被过滤元素的新 Stream,而不是从 source 删除那些元素
  • Stream的操作以Lambda表达式作为参数
  • 不支持索引访问,你可以请求第一个数据,但是缺没法访问第二个,第三个
  • 很容易生成数组或者List
  • 惰性化:所有的intermediate操作都是惰性的,就是说当调用到这些方法的时候并没有开始计算,只有调用到Terminal方法的时候,才会真正开始流的遍历,并且会生成一个结果
  • 可以是无限的。 Collection是有限的,但是streams可以是无限的,Short-circuiting操作比如 limit(n) 或者 findFirst()能允许计算无限的streams并在有限的时间内得到结果

如何得到Streams:

  • From a Collection via the stream() and parallelStream() methods
  • From an array via Arrays.stream(Object[]);
  • From static factory methods on the stream classes, such as Stream.of(Object[]), IntStream.range(int, int) or Stream.iterate(Object, UnaryOperator);
  • The lines of a file can be obtained from BufferedReader.lines();
  • Streams of file paths can be obtained from methods in Files;
  • Streams of random numbers can be obtained from Random.ints();
  • Numerous other stream-bearing methods in the JDK, including BitSet.stream(), Pattern.splitAsStream(java.lang.CharSequence), and JarFile.stream().

Intermediate 和 Terminal 操作

  • Intermediate 操作: map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered
  • Terminal 操作: forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator
  • Short-circuiting 操作:anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit

PS:Short-circuiting 操作指:对于一个 intermediate 操作,如果它接受的是一个无限大(infinite/unbounded)的 Stream,但返回一个有限的新 Stream。对于一个 terminal 操作,如果它接受的是一个无限大的 Stream,但能在有限的时间计算出结果。

reference:

https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/

相关文章

  • 关于Java8新特性Streams的思考

    设计Streams的目的 无疑这一篇是讲Java8新引入的Streams特性,但是由于Java8发布已久,各种tu...

  • java8函数式编程

    收藏几个介绍java8的文章: Functional Programming in Java: Streams F...

  • Java8特性之Lambda、方法引用和Streams

    Java8特性之Lambda、方法引用和Streams Java8已经推出了好一段时间了,而掌握Java8的新特性...

  • java8 -->streams

    stream和io流没有什么关系。它是操作管道获取source(从各种数据中获得比如array,list....)...

  • [Java8]Streams

    定义 A sequence of elements supporting sequential and paral...

  • Java8 Streams

    什么是Streams 这个里面的我们说的Streams是java.util.Streams跟java.io 里面的...

  • java8思索

    前言 看过java8,总结一下基本是lambda 函数表达,Streams操作, Predicates , Con...

  • Java8 Stream 入门

    系统的整理一下 java8 Streams 的使用。 思想 是函数式编程(functional programmi...

  • 2、java8之streams介绍

    由于所在项目组使用的是java8,开发中经常使用到java8的streams API,因此有必要做一个总结。 一、...

  • Java8 Two---- Streams

    1 collections VS stream collections 编写代码将会更加的复杂冗余, stream...

网友评论

      本文标题:Java8 Streams

      本文链接:https://www.haomeiwen.com/subject/iofubctx.html