首页 > 编程语言 >8年Java Stream API,8个问题看懂Streams!

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

时间:2022-09-18 03:12:19浏览次数:97  
标签:状态 Java Stream 元素 API 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

标签:状态,Java,Stream,元素,API,Streams,操作
From: https://www.cnblogs.com/amboke/p/16704106.html

相关文章

  • 使用 Amazon Rekognition、Lambda 和 JavaScript 进行面部识别
    使用AmazonRekognition、Lambda和JavaScript进行面部识别创建面部搜索lambda函数以按图像搜索面部亚马逊识别亚马逊识别是一个基于云的SAAS平台提供计算机......
  • JavaScript 中的混入
    JavaScript中的混入Photoby阿列克谢·鲁班on不飞溅介绍在继承中,大多数编程语言不支持多级继承,这意味着您不能为特定类拥有多个父级。Javascript也不支持多级......
  • 简单的 JavaScript 数字格式化方法
    简单的JavaScript数字格式化方法每个大型社交媒体网站都以与93.1K追随者、100万订阅者或2.5B浏览量相同的方式格式化他们的数字,他们这样做是因为用紧凑的数字设计......
  • 在 JavaScript 中从数组中删除空值
    在JavaScript中从数组中删除空值下面介绍如何在JavaScript中从数组中删除空值。我将向您展示两种方法,第一种使用纯JavaScript和数组过滤器方法,第二种使用Lodash。......
  • Day3 java数组和方法的学习
    Day3Java方法什么是方法理解上,方法和C++的函数差不多,即实现某个功能语句块的集合,尽量保证一个方法只完成一个功能。命名规则,首字母小写后面新单词大写类似studentLe......
  • Java 序列化
    Java序列化当一个对象需要持久化(存储)或者传输的时候,就用到了序列化。对象可以转换成字节序列,该字节序列包括这个对象的数据和类型信息也包括存储在对象中数据的类型。将......
  • 1天精通Apipost--全网最全gRPC调试和智能Mock讲解
    gRPC接口调试grpc作为一个老程序员,最近公司技术架构用到了gPRC,但国内很少有支持这个的工具,大部分都只是支持http。由于我同时也是Apipost骨灰级用户,于是就在他们官网......
  • Java
    Java概念简述基本环境JVM:Java虚拟机(Java程序是运行在JVM上的,不同平台的JVM实现了Java程序的跨平台运行)JRE:Java运行环境(JRE=JDK+核心类库和相关文件)JDK:J......
  • Java报错Failed to read candidate component class: file
    java.io.IOException:ServerreturnedHTTPresponsecode:500forURL:http://localhost:8080/xxxxxx/getJcpeizhisatsun.net.www.protocol.http.HttpURLConnection.......
  • JAVA 环境搭建(java 8为例)
    JAVA环境搭建下载JDK(java8为例)JDK下载地址:直达JDK镜像网站:编程宝库 javajdk镜像  安装JDK(java8为例)双击启动下载的exe文件单击下一步   可以......