问题标签 [spliterator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
505 浏览

java - 在 Scala 中使用 Java 拆分器

我在 Scala 中查询一个返回 java 可迭代对象的数据库。我调用 spilterator 方法来创建一个 spilterator 对象,但我不知道在 Scala 语法中使用 tryAdvance 或 forEachRemaining。

等效的 Java 语法如下所示,它可以工作:

这是我在 Scala 中的内容:

如您所见,我不知道如何在 scala 中调用 tryAdvance() 方法,forEachRemaining 方法也是如此。

0 投票
4 回答
1447 浏览

java - stream.spliterator() 是否关闭流?

stream.spliterator()隐式关闭stream,还是需要在之后显式关闭它?

乍一看,该.spliterator()方法似乎关闭了stream,但没有调用stream.close()。至少如果我在.spliterator()调用该方法后立即关闭它,它似乎不会影响拆分器操作。

这个问题可以扩展到其他stream方法,例如.findAny().

提出这个问题的原因是要明确何时stream需要明确关闭 a ,以及在我不需要明确关闭它的情况下,onClose()定义的操作何时发生?

0 投票
1 回答
3300 浏览

java - 了解 Java 8 和 Java 9 中的顺序与并行流拆分器

乍一看并不直截了当的关于拆分器的问题。

在流中,.parallel()更改处理流的行为。但是,我期望从顺序流和并行流创建的拆分器是相同的。例如,通常在顺序流中,.trySplit()从不调用,而在并行流中,它是为了将拆分拆分器移交给另一个线程。

stream.spliterator()vs之间的区别stream.parallel().spliterator()

  1. 它们可能具有不同的特征:

    /li>

似乎这里讨论了另一个无意义的流拆分器特征策略(并行似乎更好地计算):Understanding deep spliterator features in java 8 and java 9

  1. 它们在使用拆分方面可能有不同的行为.trySplit()

    /li>

为什么最后两个有不同的行为?如果我愿意,为什么我不能拆分顺序流?(例如,丢弃其中一个拆分以进行快速处理可能很有用)。

  1. 将拆分器转换为流时的重大影响:

    /li>

在这种情况下,拆分器是从禁用拆分能力的顺序流创建的(.trySplit()返回 null)。稍后,需要转换回流时,该流将无法从并行处理中受益。丢人现眼。

最大的问题:作为一种解决方法,在调用之前始终将流转换为并行的主要影响是什么?.spliterator()

0 投票
1 回答
322 浏览

java - 在 Java 8 的自定义流方法中支持延迟/延迟并行的最佳方法

Java 实现使用通过设计ReferencePipeline支持延迟/延迟的类。.parallel()这意味着这些每组代码行完全相同:

假设我想使用以下签名构建一个新的自定义流方法:
public <T> static Stream<T> myMethod(Stream<T> stream)

并且作为要求,该.parallel()方法应该存在相同的惰性/延迟行为。这意味着每组行应该具有完全相同的行为:

我怎样才能做到这一点?一个简单的例子会很有用。

请注意,此处讨论的并行处理中使用.spliterator()and有影响: Understandingsequential vs parallel stream spliterators in Java 8 and Java 9StreamSupport.stream()

更新:使用 assertj 的 junit5 测试:

0 投票
0 回答
186 浏览

java - 查询一个 Stream 是否被消费(不消费)

查询是否已使用流的最佳方法是什么?Stream::isConsumed曾经考虑过类似的事情吗?

我承认这类似于以下问题:

如何检查 Java 8 Stream 是否为空?

尽管如此,差异似乎是检查流消耗似乎不需要部分消耗所述流。上面链接的答案是否也适用于这里?

我的用例类似于以下内容:


显示实施细节的编辑(4/23/18) 并不那么重要。


andThen中,stream必须在附加由 产生的剩余元素之前耗尽after

诚然,有些人可能更喜欢写 a Spliterator,但即使这样,trySplit您也可能想知道从前缀拆分器拆分出来的子代在拆分后缀之前是否已经用尽了它们的元素(如果不是......?);您可能不想过早地使用任何前缀元素来这样做。

轻微相关;可能是正交的;窥视拆分器是否有用?

0 投票
1 回答
442 浏览

java - LinkedList Spliterator 不使用 size() 方法

给定 a LinkedList,我想通过Spliterator. 我不能使用方法size()。我必须实现trySplit()具有以下条件的方法:如果Spliterator至少有 5 个元素,则返回new Spliterator,它将通过前 4 个元素;否则return null。我不知道如何在以下条件下拆分它。现在我只能得到一批元素。我怎样才能得到所有批次?我在这个任务上苦苦挣扎了 5 个多小时,没有运气。先感谢您!

https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.htmlSpliteratorsize()已知/允许的情况下提供如何使用的信息。

界面:

班级:

主要方法:

预期输出:

实际输出:

0 投票
1 回答
153 浏览

java - Consumer 函数抛出异常后,Spliterator 是否可以重用?

Spliterator在其和方法中采用任意Consumer函数。tryAdvanceforEachRemaining

如果消费者抛出异常,拆分器的状态应该是什么?如果传递给的消费者forEachRemaining在 10 个项目后抛出异常(然后传播出去并被捕获),那么tryAdvance拆分器中的下一次调用是否应该返回第 11 个项目,或者此时拆分器是否应该被视为已死且无效?

javadocs 在这一点上是模棱两可的。他们只是说任何异常都将被传播出去,而没有参考拆分器在该点之后的状态

0 投票
2 回答
522 浏览

java - 从迭代器创建的 CompletableFuture 流不会被延迟评估

我在如何以及何时完成可完成的期货方面有点挣扎。我创建了这个测试用例:

输出是:

testList方法按预期工作。's 仅在最后CompletableFuture评估,因此在 limit 方法之后仅保留前两项。

然而,这个testIterator方法是出乎意料的。所有CompletableFuture的都完成了,限制只在之后完成。

如果我parallel()从流中删除该方法,它会按预期工作。但是,处理(forEach())应该并行完成,因为在我的完整程序中它是一个长时间运行的方法。

任何人都可以解释为什么会这样吗?

看起来这取决于 Java 版本,所以我使用的是 1.8:

0 投票
1 回答
151 浏览

java - 拆分器 getExactSizeIfKnown 与 estimateSize

这是在我编写 custom 时出现的Spliterator。我知道estimateSize如果我知道大小,甚至是近似值,我应该覆盖。通常,我会这样做。但是有getExactSizeIfKnown,我知道它是默认实现:

现在,假设我正在研究一个ArrayListSpliterator(我知道它已经存在,这不是重点)。我应该覆盖getExactSizeIfKnown还是estimateSize两者兼而有之?

在内部,我猜getExactSizeIfKnown实际上是被调用的,而不是 estimateSize- 因为第一个委托给第二个。考虑到理论上我正在研究一个ArrayListSpliterator,实际上不会覆盖getExactSizeIfKnown只是让我支付一个额外的方法调用 - 绕道getExactSizeIfKnown- > estimateSize

0 投票
0 回答
36 浏览

java - Spliterator SORTED 特征行为

Spliterator接口定义了许多特性:

Spliterator 还报告其结构、源和元素的一组特征(),来自 ORDERED、DISTINCT、SORTED、SIZED、NONNULL、IMMUTABLE、CONCURRENT 和 SUBSIZED。

让我们看看Sliterator#SORTED

表示遇到顺序遵循定义的排序顺序的特征值。

现在让我们看一些例子:

流没有排序,所以Spliterator.SORTED应该是false.

让我们对流进行排序:

流已排序,Spliterator.SORTED应该是true,这里没有惊喜。

最后让我们对流进行排序,但是使用自定义的Comparator.

我完全迷失在这里。为什么Spliterator.SORTEDfalse这种情况下?流使用自定义比较器进行排序:.sorted((a,b) -> a.compareTo(b)),但SORTED标志是false。这对我来说似乎不合逻辑。

让我们想象一下以下情况:

流管道中有 3 个中间操作:两个sortedfilter. 在线1:流被排序,在线2:流被过滤并且 Spliterator.SORTED仍然是true。这意味着sorted在线上的操作3:可以忽略(已经在线排序1并且SORTED标志为真。

但是,当sorted使用 with 比较器时 ->即使 compatator 相同,也会执行对 sorted 的每次调用:

可能是我误解了 javadocs,但这似乎仍然很奇怪且不合逻辑。