当前位置: 首页 > 面试题库 >

用Java有限生成的流-如何创建一个?

陈德泽
2023-03-14
问题内容

在Java中,可以轻松地生成无限流Stream.generate(supplier)。但是,我需要生成一个最终将完成的流。

想象一下,例如,我想要目录中所有文件的流。文件的数量可能很大,因此我无法预先收集所有数据并通过它们(通过collection.stream())创建流。我需要逐段生成序列。但是流显然会在某个时刻结束,并且像(collect()findAny())这样的终端运营商需要对其进行处理,因此Stream.generate(supplier)不适合在这里使用。

是否有任何合理的简便方法可以用Java实现,而无需自己实现整个Stream接口?

我可以想到一个简单的技巧-
使用infinite进行操作Stream.generate(supplier),并在获取所有实际值时提供null或引发异常。但这会破坏标准的流运算符,我只能将其与意识到这一行为的我自己的运算符一起使用。

澄清说明

评论中的人向我takeWhile()求助。这不是我的意思。如何更好地表达问题……我不是在问如何过滤(或限制)现有的流,而是在问如何动态创建(生成)流,而无需预先加载所有元素,但是该流将具有有限大小(事先未知)。

我一直在寻找的代码是

    Iterator it = myCustomIteratorThatGeneratesTheSequence();
    StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.DISTINCT), false);

我刚刚调查java.nio.file.Files了该list(path)方法的实现方式。


问题答案:

是否有任何合理的简便方法可以用Java实现,而无需自己实现整个Stream接口?

一个简单的.limit()保证,它将终止。但这并不总是那么强大。

使用Stream工厂方法后,创建海关流源而不重新实现流处理管道的最简单方法是java.util.Spliterators.AbstractSpliterator<T>将其子类化并传递给java.util.stream.StreamSupport.stream(Supplier<? extends Spliterator<T>>, int, boolean)

如果您打算使用并行流,请注意,AbstractSpliterator只会产生次佳的拆分。如果您对源代码有更多控制权,则完全实现该Spliterator接口会更好。

例如,以下代码片段将创建一个提供无限序列1,2,3 …的Stream。

在该特定示例中,您可以使用 IntStream.range()

但是流显然会在某个时刻结束,并且终端操作符(如(collect()或findAny()))需要对其进行处理。

findAny()只要有任何匹配的元素,像这样的短路操作实际上就可以在无限流上完成。

Java
9引入了Stream.iterate来为某些简单情况生成有限的流。



 类似资料:
  • 在Java中,可以使用轻松地生成无限流。但是,我需要生成一个最终完成的流。 想象一下,例如,我想要一个目录中所有文件的流。文件的数量可能很大,因此我无法预先收集所有数据并从中创建流(通过)。我需要一段一段地生成序列。但是流显然会在某个时候完成,而像(或)这样的终端操作符需要对其进行操作,因此在这里不合适。 有没有什么合理的简单方法可以在Java中做到这一点,而不用我自己实现整个流接口呢? 我可以想

  • 问题内容: 有没有简单的方法就可以使用java-8在没有外部库的情况下创建无限流? 例如在Scala中: 问题答案: 是的,有一个 简单的 方法: 作为用例: 打印出0到198,以2为步长递增。 通用方法是: 后者的用法可能更不常见。

  • 问题内容: 我想在我的应用程序中创建一个流程。但是,从Java的API环顾四周之后,我还是不太了解它。 基本上,我想创建一个多进程应用程序。但是新过程是我的应用程序中的一类。 我知道有些人可能会问为什么不创建线程?因为该类正在调用Matlab代码,所以问题出在这里,而Java类在这里 有什么办法吗? 问题答案: 只有一种方法可以用Java创建进程,基本上,它允许您像通过命令行界面一样启动新的JVM

  • 我需要遍历一个形状像树的API。例如,目录结构或讨论线程。它可以通过以下流程进行建模: 如何遍历这些数据?我的工作如下: 然而,由于我使用的是带有缓冲区的流,所以流永远不会完成。 上游完成且缓冲元件已排空时完成 流缓冲器 我多次阅读了图表周期、活跃度和死锁部分,但仍在努力寻找答案。 这将创建一个活动锁: 编辑:我添加了一个git repo来测试你的解决方案https://github.com/Ma

  • 看看我制作的以下类: 以及它在以下方面的用法: 如果我使用,可能令人惊讶的是,我将永远得不到无限流。 相反,代码将在底层方法中创建时永远循环。 到目前为止,这是纯理论上的,但如果我想首先跳过无限流中的前x个数字,然后用最后的y个数字来限制它,我可以明确地理解它的必要性,如下所示: 代码不会返回一个结果,应该怎么做呢?

  • 问题内容: 开始听说“ POJO”(普通的旧Java对象)。我用谷歌搜索,但仍然不太了解这个概念。谁能给我关于POJO的清晰描述? 考虑带有变量“ id,名称,地址,薪水”的“人员”类-在这种情况下我将如何创建POJO?代码在POJO下方吗? 问题答案: POJO只是一个普通的,已删除限制的Java Bean。Java Bean必须满足以下要求: 默认的无参数构造函数 对于名为foo的可变属性,遵