Stream API - 如果紧随其后放置 filter(),sorted() 操作如何工作?

2024-06-28

采取以下代码,对列表进行排序,然后对其进行过滤:

public static void main(String[] args) {
        List<Integer> list = List.of(3,2,1);
        
        List<Integer> filtered =  list.stream()
                .sorted() // Does sorted() sort the entire array first ? Then pass the entire sorted output to filter ?
                .filter(x -> x < 3)
                .collect(Collectors.toList());
        
        System.out.println(filtered);
    }

是否整个sort()首先发生,然后传递给filter() ?

那么这不是违反了流应该做的事情吗?

我的意思是,他们应该处理一次一个元素.


整个 sort() 是否先发生然后传递给 filter() ?

那么这不是违反了流应该做的事情吗?

不,不是。看看Stream IPA 的文档 https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/package-summary.html#StreamOps:

中间操作又分为无状态和无状态 有状态操作。无状态操作, 例如filter and map, 不保留任何状态 from 先前见过的元素当处理一个新的 element——每个元素可以独立于操作进行处理 在其他元素上。有状态操作, 例如distinct and sorted, may 合并国家 from 以前见过的元素 when 加工 新元素.

有状态操作可能需要process the 之前的整个输入 产生结果。例如,无法产生任何结果 对流进行排序,直到看到流的所有元素。作为一个 结果,在并行计算下,一些管道包含有状态 中间操作可能需要多次传递数据,或者可能 需要缓冲重要数据。管道仅包含 无状态中间操作可以一次性处理, 无论是顺序还是并行,都具有最少的数据缓冲。

这意味着sorted知道所有先前遇到的元素,即stateful. But map and filter不需要这些信息,他们是无国籍的 and lazy,这些操作总是一次处理一个来自流源的元素。

从技术上讲,不可能通过单独查看单个元素来对管道的内容进行排序。sorted运行于all“一次”元素并将排序后的流分发给下一个操作。你可能会想到sorted就好像它成为了新的溪流源头。

让我们看一下下面的流并分析它将如何处理:

Stream.of("foo", "bar", "Alice", "Bob", "Carol")
    .filter(str -> !str.contains("r")) // lazy processing
    .peek(System.out::println)
    .map(String::toUpperCase)          // lazy processing
    .peek(System.out::println)
    .sorted()                          // <--- all data is being dumped into memory
    .peek(System.out::println)
    .filter(str -> str.length() > 3)   // lazy processing
    .peek(System.out::println)
    .findFirst();                      // <--- the terminal operation

运营filter and map之前的sorted只会在需要时才延迟地应用于流源中的每个元素。 IE。filter将应用于"foo",成功通过了filter并被转化为map手术。然后filter被应用在"bar"并且它不会到达map。那么就会是"Alice"轮到通过filter,然后是map将在该字符串上执行。等等。

请记住sorted()需要所有数据来完成其工作,因此第一过滤器将对源中的所有元素执行map将应用于通过过滤器的每个元素。

Then sorted()操作会将流的所有内容转储到内存中,并对通过第一个过滤器的元素进行排序。

并且之后sorting,再次处理所有元素懒惰地一次一个。因此,第二个过滤器将被应用只有一次(虽然3元素已通过第一个过滤器并已排序)。"Alice"将通过第二个过滤器并到达终端操作findFirst()这将返回这个字符串。

看一下调试输出peek()使执行过程如上所述发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Stream API - 如果紧随其后放置 filter(),sorted() 操作如何工作? 的相关文章

  • n 个素数之和 java,困惑

    我读过几篇关于这方面的文章 我什至在一次考试中这样做过 但是是在 vb net 中 它工作得很好 但是当我尝试执行我的程序时 Eclipse 只是不停地运行 否则它会给我错误的答案 这是我的第四次尝试 我需要将前 n 个素数相加 因此我检查
  • 如何使用appium和java在Android中向下滚动以单击元素?

    我想知道如何使用appium和java向下滚动以单击Android中的元素 我里面有一个元素列表 android support v7 widget RecyclerView由于它有10多个元素 所以我们需要滑动屏幕才能看到下面的元素 每个
  • Java:如何将所有 java 日期分组到相应的周中?

    Problem 我有一个很大的日期清单 我需要按周安排它们 问题 如何按以下方式对日期进行分组一年中的一周他们在吗 示例数据集 Date date new SimpleDateFormat parse 04 01 2015 Date dat
  • GSON:如何从 Json 中获取不区分大小写的元素?

    下面显示的代码在以下情况下效果很好JSON对象包含jsonKey因为它被传递给该方法 我想知道 是否有一种方法可以获取分配给不区分大小写的键表示的值 Example public String getOutputEventDescripti
  • Java 1.6 和 Desktop.open() 的问题

    我一直在使用 Destop open 在 Windows 计算机 Vista 和 XP 上启动 pdf 查看器 并且大多数都工作得很好 但是 在一台 XP 计算机上 该调用不起作用 只是返回而不抛出任何异常 并且查看器不会启动 据我所知 在
  • 在jodatime中计算一个月的周数

    jodatime 可以计算一个月的周数吗 我需要这样的东西 月份 七月 第 27 年的一周 1 7 七月 第 28 年的一周 9 14 七月 第 29 年的一周 16 21 七月 第 30 年的一周 23 31 七月 月份 八月 第 31
  • jSoup 检查跨度类是否存在

    我有一个具有以下格式的 HTML
  • Spring 在使用 JUnit 的单元测试中不自动装配

    我使用 JUnit 测试以下 DAO Repository public class MyDao Autowired private SessionFactory sessionFactory Other stuff here 正如您所看到
  • 信用卡号应该存储为字符串还是整数?

    是啊 只是想想而已 我应该将在我的网站上输入的信用卡号存储为字符串还是整数 我的意思是 它们由数字组成 这让我认为它是一个整数 但我不对它们进行数学运算 所以也许字符串更合适 编辑 所以我必须在加密之前存储在某个时刻输入的数字 我可能应该更
  • 用 Maven 解决 jar 地狱问题?

    我正在使用两个 jars A 和 B B 是一个库 A 的类使用库 B 中的一些旧类 现在 当我将这两个 jars 包含在我的项目类路径中时 这给我带来了一个问题 因为它们的名称相同两个班级 但其中一个班级比另一个班级年长 并且行为方式不同
  • Java 8 元空间垃圾收集

    我正在运行的 java 进程在运行的第一个小时左右始终表现良好 然而 性能会迅速下降 在分析时 我发现元空间垃圾收集相当频繁地发生 直到小时标记 然后失去控制 我相当确定我能够使用 XX MaxMetaspaceSize 选项来解决此问题
  • 如何在类图中对自定义异常关联进行建模?

    Reading here http www jguru com faq view jsp EID 62790 似乎使用泛化来建模自定义异常类很常见 它没有提到的是我如何对与可能引发自定义异常的类的关联进行建模 请注意 我并不是在问如何在引发
  • Python Blowfish 加密

    由于我对 Java 的了解不完整 我正在努力将此加密代码转换为 Python 代码 两者应该得到完全相同的结果 帮助将不胜感激 Java函数 import javax crypto Cipher import javax crypto sp
  • Maven build 编译错误:无法在项目 Maven 上执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile)

    我有一个 Maven 项目 从 git 存储库分叉并克隆到我的 Eclipse 上 它是基于 Java 8 构建的 我做的第一件事是执行 mvn clean install 但我收到以下失败消息 INFO Scanning for proj
  • 异常中的错误代码与异常层次结构

    您认为在异常中使用错误代码来指定错误类型可以吗 请看一下这段代码 public class MyException extends Exception public static final String ERROR CODE INVALI
  • 在 OpenCV 中将 `BufferedImage` 转换为 `Mat`

    我怎样才能转换BufferedImage to a Mat in OpenCV 我正在使用 JAVA 包装器OpenCV not JavaCV 由于我是新手OpenCV我在理解如何做时遇到一些问题Mat works 我想做这样的事情 基于
  • JavaFX ComboBox - 显示文本但在选择时返回 ID

    我有一个包含机场的数据库表 每个机场都有一个名称和一个 ID 在 JavaFX 中我有一个表单 其中包含ComboBox 组合框需要显示所有机场名称 并且在提交表单时需要将机场的 ID 插入数据库 而不是其名称 但我并没有真正弄清楚解决方案
  • 如何用java实现FTP?

    我正在使用 FTP 我必须在客户端将消息嵌入到图像文件中 并且我必须将其发送到服务器 在服务器端我必须检索图像文件并然后我将检索该消息 我已经完成了嵌入消息并使用密码学和隐写术技术检索消息 我正在寻找如何将该文件从客户端传输到服务器 我必须
  • 如何处理 Sonarlint java:S2259 (空指针不应取消引用)

    if res getBody null res getBody getServiceResult null return 在上面的代码中 sonarlint 抱怨说 SonarLint 可能会抛出 NullPointerException
  • 当已经使用 id“org.springframework.boot”插件时,我们是否需要“io.spring.dependency-management”gradle 插件

    当 spring boot 插件添加到 Gradle 项目时会发生什么 为什么我们还需要显式包含 spring dependency management 插件 plugins id org springframework boot ver

随机推荐

  • 阅读共享偏好

    我正在为我的 Android 应用程序的设置菜单使用共享首选项 它工作得很好 但我不知道如何在我的代码中使用这些设置 例如 如何使用所选语言并在另一个活动中使用它
  • 使用张量流 tf-transform 进行数据标准化

    我正在使用 Tensorflow 对我自己的数据集进行神经网络预测 我做的第一个模型是与我计算机中的小数据集一起使用的模型 之后 我稍微更改了代码 以便使用具有更大数据集的 Google Cloud ML Engine 在 ML Engin
  • 使用 Auth0、withAuthenticationRequired 登录不会显示在 Gatsby 中

    我将 Gatsby 与 auth0 一起使用 当我用withAuthenticationRequired 然后我得到一个空白页 上面写着 重定向 import as React from react import withAuthentic
  • Python:pip 找不到 setup.py

    我怎样才能直接pip找到setup py My setup py文件位于 setuptools 3 5 1 I ran dustin dustin python setuptools 3 5 1 setup py egg info runn
  • 以编程方式添加超链接到列表项

    我想以编程方式获得以下 HTML ul li a href a li ul 我可以添加 li to ul But a to li 不可能 My code BulletedList ul new BulletedList ListItem l
  • React Table - useRowSelect 的单选输入

    如何在 React Table 中使用单选输入而不是复选框作为可选表 有一个复选框但没有单选按钮的示例 https github com tannerlinsley react table blob master examples row
  • 无法访问内存-gdb

    这是我的disas代码 Dump of assembler code for function main 0x00000000000006b0 lt 0 gt push rbp 0x00000000000006b1 lt 1 gt mov
  • Java进程的dump文件分析?

    如果我使用 Windbg 转储 Windows 上运行的 Java 进程 我可以 容易吗 分析 Java 堆 对象和线程吗 就像我可以使用 SOS 进行 Net 进程一样吗 否则 如何离线调试生产系统上发生的问题 Thanks Window
  • 等待异步TaskEx

    What is TaskEx In http www i programmer info programming c 1514 async await and the ui problem html start 1 http www i p
  • 类型错误:序列项 0:预期字符串,未找到 NoneType

    我正在努力改进战舰游戏 原始版本工作正常 没有错误 我编写了代码来帮助克服第一个版本每次都将船只放置在同一个位置的事实 因此我从一艘船 由两个方块组成 开始 我通过创建两个函数来完成此操作 第一个函数生成一个随机坐标 Destroyer 2
  • catch(...) 没有捕获异常,我的程序仍然崩溃

    我的测试仪遇到问题 我的应用程序在初始化时崩溃 我添加了更多的日志记录和异常处理 但它仍然崩溃并显示通用的 此程序已停止工作 消息 而不是触发我的错误处理 鉴于我的 main 看起来像这样并且有catch 什么情况下不会触发 try sim
  • Collectors.groupingBy() 返回按升序排序的结果 java

    我按降序发送结果 但得到的输出按升序排列 List
  • 如何使用RxJsdistinctUntilChanged?

    我正在开始使用 RxJs 使用 v5 beta 但不知何故我不知道如何使用distinctUntilChanged 如果我在 babel node 中运行下面的代码 其输出是 a 1 key a state 1 Next value 42
  • Boto 与 EC2 IAM 角色间歇性“无法加载凭证”

    我使用 Elastic Beanstalk 环境来部署 Web 应用程序 并为应用程序将在其上运行的实例设置了 IAM 角色 99 99 的时间里一切都完美无缺 但是我会间歇性地在日志中看到错误 请求失败显示 botocore 错误 如下所
  • Python - 比较2个文件并输出差异

    我的目标是编写一个脚本来比较文件中的每一行 并根据此比较创建一个新文件 其中包含第二个文件中不存在的文本行 例如 File 1 Bob 20 Dan 50 Brad 34 Emma 32 Anne 43 File 2 Dan 50 Emma
  • SQL Server 2008:TOP 10 和不同的一起

    正如标题所示 我正在使用 SQL Server 2008 如果这个问题非常基本 我深表歉意 我才使用 SQL 几天 现在我有以下查询 SELECT TOP 10 p id pl nm pl val pl txt val from dm la
  • excel vba范围单元格错误对象定义[重复]

    这个问题在这里已经有答案了 我一直在 Excel 中开发一个宏 该宏对一张工作表 次要 中的表格进行排序 当满足条件时 它应该将该表中的数据添加到第二张工作表 Sheet1 中的另一个表格中 但是我一直运行时出现 1004 错误 对象未定义
  • 需要更好的等待解决方案

    最近 我一直在用 C 编写一个程序 它可以 ping 三个不同的网站 然后根据通过或失败的情况 它将等待 5 分钟或 30 秒 然后再次尝试 目前我一直在使用ctime库和以下函数来处理我的等待 然而 根据我的 CPU 计量表 这是一个不可
  • Jetpack Compose Navigation - 将参数传递给 startDestination

    我正在构建的应用程序使用带有路线的组合导航 挑战在于起始目的地是动态的 这是一个最小的例子 class MainActivity ComponentActivity override fun onCreate savedInstanceSt
  • Stream API - 如果紧随其后放置 filter(),sorted() 操作如何工作?

    采取以下代码 对列表进行排序 然后对其进行过滤 public static void main String args List