阅读 239

JAVA Stream杂谈(一): 为什么要使用StreamApi

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

java在集合的处理方式上,除了for、迭代器之外。

直到java8的发布。

1. Why,为什么要使用Stream

数据处理越来越重要而且越来越复杂!

  • 要处理的数据量越来越大
  • 控制的响应时间
  • 复杂的算法

因此,数据处理需要高级原语:

  • 能够访问数据,无论它在哪里。
  • 提供 映射/过滤/减少 等功能。
  • 或许需要并行实现。

这里引用官方说的话:Collections and streams, while bearing some superficial similarities, have different goals. Collections are primarily concerned with the efficient management of, and access to, their elements. By contrast, streams do not provide a means to directly access or manipulate their elements, and are instead concerned with declaratively describing their source and the computational operations which will be performed in aggregate on that source. However, if the provided stream operations do not offer the desired functionality, the BaseStream.iterator() and BaseStream.spliterator() operations can be used to perform a controlled traversal.

译:集合和流虽然表面上有一些相似之处,但它们有不同的目标。集合主要关心对其元素的有效管理和访问。相反,流不提供直接访问或操作它们的元素的方法,而是关注于声明性地描述它们的源和将在该源上聚合执行的计算操作。但是,如果提供的流操作不能提供所需的功能,则可以使用BaseStream.iterator()和BaseStream.spliterator()操作。

2. What,什么是java8 Stream

  • 没有存储。Stream不是存储元素的数据结构。
  • 功能性。对流的操作会产生结果,但不会修改其源。
    • 例如,过滤Stream 从集合中获得的 a 会生成一个Stream没有过滤元素的新元素,而不是从源集合中删除元素。
  • 懒惰寻求。许多流操作,例如过滤、映射或重复删除,可以懒惰地实现,从而暴露优化机会。
    • 执行中间操作,例如 filter()实际上并不执行任何过滤,而是创建一个新流,该流在遍历时包含与给定谓词匹配的初始流的元素。管道源的遍历直到管道的终端操作被执行后才开始。
  • 可能无界。虽然集合具有有限的大小,但流不需要。
    • 诸如limit(n)或之类的短路操作findFirst()可以允许在有限时间内完成对无限流的计算。
    • 对于诸如“查找第一个长度超过 1000 个字符的字符串”之类的操作,只需检查足够多的字符串即可找到具有所需特征的字符串,而无需检查源中所有可用的字符串。(当输入流是无限的而不仅仅是大时,这种行为变得更加重要。)
  • 消耗品。流的元素在流的生命周期内仅被访问一次。与一样Iterator,必须生成新的流以重新访问初始的源

对于java,它是一个全新的概念:函数式。但是在其他语言领域,函数式早已不是新鲜事。

JAVA Stream杂谈(一): 为什么要使用StreamApi

JAVA Stream杂谈(二): 函数式编程的概念

文章分类
后端
文章标签