当前位置: 首页 > 知识库问答 >
问题:

Java流阶段是连续的吗?

赵昊阳
2023-03-14

我有一个关于中间阶段顺序状态的问题--是一个阶段的操作应用于所有输入流(项),还是所有阶段/操作应用于每个流项?

我知道这个问题可能不容易理解,所以我举一个例子。关于以下流处理:

List<String> strings = Arrays.asList("Are Java streams intermediate stages sequential?".split(" "));
strings.stream()
           .filter(word -> word.length() > 4)
           .peek(word -> System.out.println("f: " + word))
           .map(word -> word.length())
           .peek(length -> System.out.println("m: " + length))
           .forEach(length -> System.out.println("-> " + length + "\n"));
f: streams
f: intermediate
f: stages
f: sequential?

m: 7
m: 12
m: 6
m: 11

-> 7
-> 12
-> 6
-> 11
f: streams
m: 7
-> 7

f: intermediate
m: 12
-> 12

f: stages
m: 6
-> 6

f: sequential?
m: 11
-> 11

如果这个问题不够清楚,我可以进一步详细说明。

共有1个答案

百里雅珺
2023-03-14

这种行为可以优化代码。如果每个中间操作都要在进行下一个中间操作之前处理流的所有元素,那么就没有优化的机会。

因此,为了回答您的问题,每个元素沿着流管道一次一个地垂直移动(后面讨论的一些有状态操作除外),因此可以在可能的情况下进行优化。

根据您提供的示例,每个元素将沿着流管道逐个垂直移动,因为没有包含有状态的操作。

List<String> stringsList = Arrays.asList("1","12","123","1234","12345","123456","1234567");
int result = stringsList.stream()
                        .filter(s -> s.length() > 4)
                        .mapToInt(Integer::valueOf)
                        .findFirst().orElse(0);

阅读:Java 8流教程

 类似资料:
  • 问题内容: 鉴于流,例如, 如何最优雅地将其转换为给定形式: (当然,假设我已经定义了Pair类)? 编辑:这不严格有关整数或原始流。对于任何类型的流,答案应该是通用的。 问题答案: 我的StreamEx库扩展了标准流,它pairMap为所有流类型提供了一种方法。对于原始流,它不会更改流类型,但可用于进行一些计算。最常见的用法是计算差异: 对于对象流,你可以创建任何其他对象类型。我的库没有提供任何

  • 问题内容: (现已失效)页面http://stream.twitter.com/1/statuses/sample.json用于返回连续无休止的JSON数据流。 我想在自己的网页中使用jQuery(或JavaScript,但最好是jQuery)对其进行处理,以便能够基于实时推文显示视觉效果。 据我所知,jQuery 函数仅在服务器发送完所有数据后才执行回调函数,但这实际上是连续的数据流。我如何“按

  • 问题内容: 可以在连续流上使用吗? 我的意思是说是一条命令,但在输出中仅保留我感兴趣的行。 我已经尝试过了,但是似乎只能在完成后才能执行,也就是说永远不会执行。 问题答案: 使用BSD grep(FreeBSD,Mac OS X等)时,打开的行缓冲模式。 您无需为GNU grep(几乎在任何Linux上使用)执行此操作,因为它会默认刷新(对于其他类似Unix的版本,如SmartOS,AIX或QNX

  • 我一直在尝试将更多的函数式编程融入到我所做的事情中,因为我编写的代码具有无副作用的性质,并且在并发代码中具有实用性。我遇到了需要过滤掉java流的连续元素的情况,并且没有比简单的旧命令方法更好的函数方法了。假设我有一个记录参数的程序,我想过滤掉两个连续的元素。例如,。我在日志中想要的是。 我提出了几种方法,但没有一种方法比使用for循环更容易理解,该循环索引了我需要过滤掉的内容。 这似乎是一件很平

  • 问题内容: 简化的管道如下所示: 对于步骤5,我设置了Jenkins管道输入命令。我们不会在每次提交时都将产品部署到产品上,因此,如果我们中止所有这些工作,它将有大量的灰色版本。是否可以使用跳过选项,以使构建仍可以显示为 绿色 蓝色? 问题答案: 您不能这样做吗,无论您从输入中选择什么,它都会变成蓝色/绿色,然后您也可以根据它来运行部署?

  • 我想在提取一些数据时使用外部工具(循环通过行)。为此,我首先使用了Runtime.getRuntime()。exec()执行它。但后来我的提取变得很慢。所以我在寻找一种可能性,在循环的每个实例中,使用shell的同一个实例来执行外部工具。 我发现,我应该使用ProcessBuilder。但是现在还不行。 这是我测试执行的代码(已经从论坛中的答案输入): 我想在另一个类中调用它,例如 Testcla