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 不飞溅
一些基础知识:
- 功能接口 :具有单个抽象方法的接口。
- Lambda 表达式 :实现功能接口的单一抽象方法。
- 流: Lambda 表达式作为参数传递给流操作以读取/修改数据。
1. 什么是流?
提供一种使用函数式编程范例对一系列元素执行一系列操作的方法。如果您不了解函数式编程,请快速查看第 8 个问题。
Collect squares of numbers greater than twenty-five.
2. 什么不是流?
- Stream 不是像 Collections 这样的数据结构,Stream 只知道在管道中需要时在哪里查找元素。
- 集合专注于有效地组织数据。
- Streams 专注于有效地组织计算。
3.如何创建Stream?
Stream由三部分组成
- 元素来源
- 零个或多个中间操作
- 触发流的单个终端操作。
1. 来源
元素的来源可以是集合、数组、生成器函数和 I/O 通道。您可以使用不同的方法在源上创建顺序或并行流。下面列出了其中的一些。
Methods to create a Stream
并行流使用工作线程在元素源上并行执行操作。重要的是要注意并行流并不总是更快,但它确实有自己的开销,将流分成多个部分并在最后组合结果。需要注意的是,在这种情况下,Lambda 必须以无状态方式实现,因为它们可以由多个线程并行执行。撇开这些事情不谈,并行流确实有很多优化性能的潜力。
您将知道何时需要并行流,因此在此之前保持简单!
2. 中间操作:
- Stream 可以有零个或多个中间操作。
- 它可以是有状态或无状态的操作。有状态的操作,如 排序() 依赖于流中的所有元素,而无状态操作如 筛选() , 和 地图() 可以在流元素上独立执行。无状态操作可以通过执行并行执行在内部进行优化。
Intermediate Operations
3、终端操作:
- 该操作触发流管道执行操作
- 操作可以像短路一样 限制(),findFirst() 这减少了流的长度或非短路,如 收集(),forEach()。
Terminal Operations
5. 如何使用流?
Stream Examples
6. Stream 如何在内部工作?
创建流:
- 拆分迭代器 是 Java SE 8 中引入的另一个迭代器,它通过拆分和迭代流元素来支持并行编程。
- Stream 还捕获描述元素特征的不同状态标志,如果源是 TreeSet,则捕获 SORTED 标志。
SIZED、DISTINCT、SORTED 和 ORDER 等标志用于捕获流元素的状态。
中间操作:
- 在每个操作中,如果流的状态更改或添加,则使用状态标志进行优化或修改
- 这些标志用于每个阶段的优化,例如如果流在前一个阶段已经排序,则不会再次排序。
终端操作:
- 它根据无状态决定流程 过滤器(),地图()和平面地图() 和有状态的操作,如 sorted()、limit() 和 distinct()
- 如果管道是按顺序执行的,或者是并行执行的,但由所有无状态操作组成,则可以一次计算。否则,管道在有状态的操作边界处被划分为多个部分,并在多个通道中计算。
- 终端操作要么像短路一样 限制(),findFirst() 或非短路之类的 减少(),收集() .如果终端操作是非短路的,则可以使用 forEachRemaining() 的方法 分离器 .如果是短路,则必须一次处理一个元素 尝试前进()
7. 流的优势是什么?
- 简洁明了的代码。
- 您可以轻松阅读和理解具有许多复杂操作的代码。
- 并行处理不需要重写代码。一旦确定,只需在源上使用并行流。
- 将流管道表示为一系列操作,可以通过使用状态标志实现几种有用的执行策略。
- 我们可以从 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 版权协议,转载请附上原文出处链接和本声明