8年Java Stream API,8个问题看懂Streams!

8年Java Stream API,8个问题看懂Streams!

是 es,自 Java SE 8 发布以来已经 8 年了,其中包含 Stream API、Functional Interfaces、Time API 和许多更重要的特性,但是 Lambda 和流 是向 Java 开发人员介绍函数式编程的原因。

让我们了解 Streams 及其用法!

Photo by 马特·保罗·卡塔拉诺 on 不飞溅

一些基础知识:

  1. 功能接口 :具有单个抽象方法的接口。
  2. Lambda 表达式 :实现功能接口的单一抽象方法。
  3. 流: Lambda 表达式作为参数传递给流操作以读取/修改数据。

1. 什么是流?

提供一种使用函数式编程范例对一系列元素执行一系列操作的方法。如果您不了解函数式编程,请快速查看第 8 个问题。

Collect squares of numbers greater than twenty-five.

2. 什么不是流?

  1. Stream 不是像 Collections 这样的数据结构,Stream 只知道在管道中需要时在哪里查找元素。
  2. 集合专注于有效地组织数据。
  3. Streams 专注于有效地组织计算。

3.如何创建Stream?

Stream由三部分组成

  1. 元素来源
  2. 零个或多个中间操作
  3. 触发流的单个终端操作。

1. 来源

元素的来源可以是集合、数组、生成器函数和 I/O 通道。您可以使用不同的方法在源上创建顺序或并行流。下面列出了其中的一些。

Methods to create a Stream

并行流使用工作线程在元素源上并行执行操作。重要的是要注意并行流并不总是更快,但它确实有自己的开销,将流分成多个部分并在最后组合结果。需要注意的是,在这种情况下,Lambda 必须以无状态方式实现,因为它们可以由多个线程并行执行。撇开这些事情不谈,并行流确实有很多优化性能的潜力。

您将知道何时需要并行流,因此在此之前保持简单!

2. 中间操作:

  1. Stream 可以有零个或多个中间操作。
  2. 它可以是有状态或无状态的操作。有状态的操作,如 排序() 依赖于流中的所有元素,而无状态操作如 筛选() , 和 地图() 可以在流元素上独立执行。无状态操作可以通过执行并行执行在内部进行优化。

Intermediate Operations

3、终端操作:

  1. 该操作触发流管道执行操作
  2. 操作可以像短路一样 限制(),findFirst() 这减少了流的长度或非短路,如 收集(),forEach()。

Terminal Operations

5. 如何使用流?

Stream Examples

6. Stream 如何在内部工作?

创建流:

  1. 拆分迭代器 是 Java SE 8 中引入的另一个迭代器,它通过拆分和迭代流元素来支持并行编程。
  2. Stream 还捕获描述元素特征的不同状态标志,如果源是 TreeSet,则捕获 SORTED 标志。

SIZED、DISTINCT、SORTED 和 ORDER 等标志用于捕获流元素的状态。

中间操作:

  1. 在每个操作中,如果流的状态更改或添加,则使用状态标志进行优化或修改
  2. 这些标志用于每个阶段的优化,例如如果流在前一个阶段已经排序,则不会再次排序。

终端操作:

  1. 它根据无状态决定流程 过滤器(),地图()和平面地图() 和有状态的操作,如 sorted()、limit() 和 distinct()
  2. 如果管道是按顺序执行的,或者是并行执行的,但由所有无状态操作组成,则可以一次计算。否则,管道在有状态的操作边界处被划分为多个部分,并在多个通道中计算。
  3. 终端操作要么像短路一样 限制(),findFirst() 或非短路之类的 减少(),收集() .如果终端操作是非短路的,则可以使用 forEachRemaining() 的方法 分离器 .如果是短路,则必须一次处理一个元素 尝试前进()

7. 流的优势是什么?

  1. 简洁明了的代码。
  2. 您可以轻松阅读和理解具有许多复杂操作的代码。
  3. 并行处理不需要重写代码。一旦确定,只需在源上使用并行流。
  4. 将流管道表示为一系列操作,可以通过使用状态标志实现几种有用的执行策略。
  5. 我们可以从 API 方法返回流,以前您可能会返回一个数组或集合。这将帮助客户端代码根据要求收集流。

8. 什么是函数式编程?

让我们快速理解一下,函数式编程是声明式编程的一个子集

声明式风格与通常的命令式风格?

在声明式风格中,您定义 该怎么办 代替 怎么做 .检查下面的简单示例。

命令式 :我们定义变量总和,迭代10个数字并将它们添加到总和中。基本上,我们正在定义如何添加 10 个数字。

声明式: 做 10 个数字的总和。刚刚宣布它。

就是这样,谢谢!

关注更多内容!

查看我关于系统设计的其他故事

[

我如何与亚马逊和微软进行系统设计面试?

帮助我通过亚马逊的 SDE2 和微软的 L61 的系统设计方法

levelup.gitconnected.com

](https://levelup.gitconnected.com/how-to-approach-system-design-interviews-c272996bdfaa)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/37428/55101802

posted @ 2022-09-18 02:55  哈哈哈来了啊啊啊  阅读(33)  评论(0编辑  收藏  举报