zoukankan      html  css  js  c++  java
  • 浅谈Streams,什么是Stream。

      直译过来的字面意思是“流”,它不同于java的InputStream和OutputStream,这是两个完全不同的概念。

    Java 8中的Stream其实是函数式编程里Monad的概念(Monad的概念可以参考:

      http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html#monads)。

    Monad就是一种设计模式,表示将一个运算过程,通过函数拆解成互相连接的多个步骤,有点链式操作的感觉。

    它将计算过程封装到流程里面,而这个过程就用链式调用来实现,如下例子:

     

    // 我们以前遍历数据使用这种显示的方法
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); 2 int sum = 0; 3 for (int n : numbers) { 4 if (n % 2 == 1) { 5 int square = n * n; 6 sum = sum + square; 7 } 8 } 9 System.out.println(sum);
    1 //stream则用这种链调用,内部循环方式
    2 List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    3     int sum = numbers.stream()
    4         .filter(n -> n % 2  == 1)
    5         .map(n  -> n * n)
    6         .reduce(0, Integer::sum);
    7     System.out.println(sum);

    更深层理解一下上面code,其实是stream是一个 数据值的序列,支持并行和聚合操作(aggregate operations.)。我们经常在SQL中使用聚合函数。

    聚合操作作用在一个项目(或者是一个数据对象)的列上并返回一个单独的值。Stream的聚合操作的结果可以是原始值,一个对象,或者是一个void的流。像SQL一样,我们可以计算整数流中所有整数的和。

      看起来貌似它和集合差不多,其实还是不同的,两者的比较如下:

      Java集合关注如何存储数据元素以实现高效访问。
      Java流致力于对来自数据源的数据元素的聚合操作。

    描绘一下Stream的特点:

     一.No Storage(没有存储)

      没有存储空间。按需从数据源提取元素,并将它们传递到操作管道进行处理。

     二.Infinite Streams无限流

      集合不能表示一组无限的元素,而Stream可以。Stream可以从数据源中提取元素。数据源可以是集合,生成数据的功能,I / O通道等。

      Stream可以从生成无限数量元素的函数中提取数据。

     三.Not Reusable不可重复用

      在重用的情况下,Stream可能抛出IllegalStateException。

    其实Stream还有许多内容,他是java的jdk库中的重要部分,以上是部分理解,以后慢慢完善。

  • 相关阅读:
    jupytr notebook远程登录Linux服务器,切换conda虚拟环境
    Linux 命令su 和 su -执行机制的区别
    Shell编程知识4-su详细
    Shell编程知识3
    Shell编程知识2
    Ubuntu # echo $PATH //查看当前用户的环境变量--》修改配置环境变量
    Util和Helper类
    Qt QBarSeries简易柱状图教程
    解决QIcon引用qrc不显示图片
    qt调用quit()后未结束线程解决方案
  • 原文地址:https://www.cnblogs.com/Williamwen/p/13322699.html
Copyright © 2011-2022 走看看