gpt4 book ai didi

Java 8 最大过滤器针对 SortedSet 进行了优化?

转载 作者:行者123 更新时间:2023-11-30 04:01:46 25 4
gpt4 key购买 nike

如果我根据某个最大值或最小值过滤排序集或映射,Java 8 会无意识地检查每个元素的条件还是会使用“排序”进行优化?如果没有,是否有更好的方法仍然使用 Java 8 并行性?

SortedSet<Integer> numbers = getNumbers();
numbers.parallelStream().filter(n -> n <= 100).forEach(...);

附注:根据要求澄清:假设“数字”非常大。如果我们检查每个元素,如果它 <= 100 (或任何其他数字),我们会浪费大量时间。一个有效的实现是对排序集合进行二分搜索,并在对数时间而不是线性时间中识别截止,然后使用一些内部集合功能来在此截止点创建一个子集

最佳答案

将方法 headSet 与并行流结合使用。在您的示例中,它如下所示:

SortedSet<Integer> numbers = getNumbers();
numbers.headSet(100 + 1)
.parallelStream()
.filter(n -> n <= 100) // no longer required
.forEach(...);

首先,代码执行对数复杂度的二分搜索。之后,所有小于 100 + 1 的元素都会并行处理。

编辑:不幸的是,TreeSetConcurrentSkipListSet 都不支持子集上的并行执行。上面的代码可以工作,但它总是按顺序执行。可以使用以下代码检查这一点。我看不出有什么理由不能实现。我想没有人认为这可能很重要。

SortedSet<Integer> numbers = ...;
System.out.printf("Full Set: %s\nPartial Set: %s\n",
numbers.spliterator().trySplit(),
numbers.headSet(1_000_000).spliterator().trySplit());

关于Java 8 最大过滤器针对 SortedSet 进行了优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21812623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com