- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个数据源,我知道该数据源包含 n
个元素,我可以通过重复调用对象上的方法来访问该数据源;为了举例,我们将其称为 myReader.find()
。我想创建一个包含这些 n
元素的数据流。还可以说,我不想调用 find()
方法的次数超过我想要返回的数据量,因为它会抛出异常(例如 NoSuchElementException
>) 如果在到达数据末尾后调用该方法。
我知道我可以使用 IntStream.range
创建此流方法,并使用 find
方法映射每个元素。然而,这感觉有点奇怪,因为我完全忽略了流中的 int 值(我实际上只是使用它来生成恰好包含 n
元素的流)。
return IntStream.range(0, n).mapToObj(i -> myReader.read());
我考虑过的一种方法是使用 Stream.generate(supplier)
接下来是 Stream.limit(maxSize)
。根据我对 limit
函数的理解,这感觉应该可行。
Stream.generate(myReader::read).limit(n)
但是,我在 API 文档中没有看到任何指示 Stream.limit()
方法将保证精确地由调用它的流生成 maxSize
元素。只要最终结果只是前 n 次调用,流实现就可以调用生成器函数超过 n 次,这并非不可行。只要它满足作为短路中间操作的 API 约定。
Returns a stream consisting of the elements of this stream, truncated to be no longer than maxSize in length.This is a short-circuiting stateful intermediate operation.
An intermediate operation is short-circuiting if, when presented with infinite input, it may produce a finite stream as a result. [...] Having a short-circuiting operation in the pipeline is a necessary, but not sufficient, condition for the processing of an infinite stream to terminate normally in finite time.
仅依赖 Stream.generate(generator).limit(n)
对底层生成器进行 n
次调用是否安全?如果是这样,我是否缺少一些关于这一事实的文档?
并避免 XY Problem :通过精确执行操作n
次来创建流的惯用方法是什么?
最佳答案
Stream.generate
creates an unordered Stream 。这意味着后续的 limit
操作不需要使用前 n 个元素,因为当没有顺序时没有“第一个”,但可以选择任意 n 个元素。实现可能会利用此权限,例如以获得更高的并行处理性能。
以下代码
IntSummaryStatistics s =
Stream.generate(new AtomicInteger()::incrementAndGet)
.parallel()
.limit(100_000)
.collect(Collectors.summarizingInt(Integer::intValue));
System.out.println(s);
打印类似的内容
IntSummaryStatistics{count=100000, sum=5000070273, min=1, average=50000,702730, max=100207}
在我的机器上,而最大数量可能会有所不同。它表明 Stream 已根据需要准确选择了 100000
元素,但没有选择 1 到 100000 之间的元素。由于生成器生成严格升序的数字,因此很明显它已被调用超过 100000 次得到比这个更高的数字。
另一个例子
System.out.println(
Stream.generate(new AtomicInteger()::incrementAndGet)
.parallel()
.map(String::valueOf)
.limit(10)
.collect(Collectors.toList())
);
在我的机器上打印类似的内容(JDK-14)
[4, 8, 5, 6, 10, 3, 7, 1, 9, 11]
使用 JDK-8,它甚至会打印类似的内容
[4, 14, 18, 24, 30, 37, 42, 52, 59, 66]
如果像这样的结构
IntStream.range(0, n).mapToObj(i -> myReader.read())
由于未使用i
参数,感觉很奇怪,您可以使用
Collections.nCopies(n, myReader).stream().map(TypeOfMyReader::read)
相反。这不会显示未使用的 int
参数,并且效果同样好,因为事实上,它在内部实现为 IntStream.range(0, n).mapToObj(i -> element)
.没有办法绕过某些计数器(无论是可见的还是隐藏的)来确保该方法将被调用n次。请注意,由于 read
可能是有状态操作,因此在启用并行处理时,生成的行为将始终像无序流一样,但 IntStream
和 nCopies
code> 方法创建一个有限流,该流永远不会调用该方法超过指定次数。
关于java - 对于Java流,generate + limit是否保证不会额外调用生成器函数,或者是否有更好的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63929040/
好吧,我对我的页面发生的事情有点困惑。我在底部有页码, table 上摆满了 23 种不同的元素。 每个页面应一次显示 5 个项目。我显示的页面发送了一个带有 pagenumber = 不管怎样的 g
几周前我开始学习 Ada。我知道 limited 在某些情况下声明了一个有限类型,不允许复制对象 来自 Ada Reference Manual 2012 7.5 1/2 A limited type
我想按 DESC 选择日期并限制为最后 3 个,然后我需要基本上翻转最后 3 个结果,以便它们按 ASC 排序 任何帮助将不胜感激,我正在使用 postgresql 最佳答案 SELECT * FRO
SELECT * FROM mm_tfs WHERE product_slug LIKE '%football%' AND schoolid = '8' AND category_id ='2
SELECT * FROM mm_tfs WHERE product_slug LIKE '%football%' AND schoolid = '8' AND category_id ='2
我正在尝试访问按“日期”键排序的表中恒定数量的最新文档。请注意,不幸的是,日期是被实现的(不是由我......),使得该值设置为字符串,例如“2014-01-14”,或者有时“2014-01-14 2
我目前正在使用具有限制 cpu、限制内存以及保留 cpu 和内存的 Docker Swarm。 完成测试后,我想删除这些配置。我找不到任何有关如何删除这些的文章。 是否有办法通过更新来删除这些设置而不
我目前正在使用具有限制 cpu、限制内存以及保留 cpu 和内存的 Docker Swarm。 完成测试后,我想删除这些配置。我找不到任何有关如何删除这些的文章。 是否有办法通过更新来删除这些设置而不
我必须对我的数据应用分页。我通过复杂的连接查询获取数据,没有任何子查询,只有简单的连接。 假设这个查询[这是一个非常简单的查询,我有一个比这个复杂的查询] SELECT states.state
我经常制作条形图,并将条形图的值额外包含为注释 (geom_text)。通常,我更喜欢这些值右对齐(与将标签放在条形顶部相反)。在绘制多面条形图时,我将这些值放在每个组中的最大值(我之前计算过)加上我
delivery-limit 和 x-delivery-limit 有什么区别? 当我将 x-delivery-limit 设置为 RabbitMQ 队列参数时,我可以看到它限制了我的消息重新排队尝试
delivery-limit 和 x-delivery-limit 有什么区别? 当我将 x-delivery-limit 设置为 RabbitMQ 队列参数时,我可以看到它限制了我的消息重新排队尝试
我正在使用 PostgreSQL 9.3。这应该在具有 100,000 多行的任何表上重现。 EXPLAIN ANALYZE 显示使用 LIMIT 2 扫描了更多行,但我不明白为什么。 限制 1: E
我正在尝试找出是否可以在 PHP 中全局设置和取消设置 MySQL 结果的默认限制。 一些可能看起来像的伪代码: $pdo->prepare('SELECT * FROM example'); $pd
我有下面的代码片段表 在这里我必须对投票前 3 个值求和。 假设 product_id 3030 vote 列的总和为 8.1 和 3671 总和 是 5.2 在这里,我必须获得前 3 个 produ
我正在使用全文搜索来提取行。 我根据分数 (ORDER BY SCORE) 对行进行排序,然后在前 20 行 (LIMIT 20) 中,我想对结果集进行兰德 (RAND)。 因此,对于任何特定的搜索词
帮助创建搜索条件 SELECT * FROM mlt_adr_city WHERE name LIKE "Text%" AND region_id = 59 AND id <> 0 IF (name
MySQL 查询示例: SELECT message_id, message_text FROM messages LIMIT 0 , 30 我得到的这个提示是错误的: HIN
我注意到如果我将查询限制为 1 个而不是 5 个,速度会急剧下降。 SELECT he. * FROM homematic_events he WHERE he.homematic_devices_i
我需要从我的表中获取最后一个 ID,以便我可以在另一个函数中使用它我在我的存储库中创建了这个函数,但我没有工作,它显示了一个错误: [Syntax Error] line 0, col 60: Err
我是一名优秀的程序员,十分优秀!