【问题标题】:Java 8 maximum filter optimized for SortedSet?为 SortedSet 优化的 Java 8 最大过滤器?
【发布时间】:2014-02-16 14:41:16
【问题描述】:

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

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

P.S.:根据要求澄清: 假设“数字”非常大。如果我们检查每个元素,如果它 sorted 集合上进行 二分搜索,并在 log 时间而不是线性时间 中识别截止值,然后使用一些内部集合功能来在这个截止点创建一个子集

【问题讨论】:

  • 简短的回答是它不会使用项目已排序的事实;原因是它不知道您的过滤器是可以通过这种方式优化的简单比较。对于流,过滤器只是获取一个项目并返回一个boolean

标签: java filter java-8 sortedset


【解决方案1】:

结合并行流使用方法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());

【讨论】:

  • TreeMap 的源代码中有一个解释性声明:“目前,我们只支持完整地图的基于 Spliterator 的版本,无论是普通的还是降序的形式,否则依赖于默认值,因为子图的大小估计将主导成本。
【解决方案2】:

您能否详细说明“某个最大值或最小值”是什么意思?您的示例代码使用硬编码值 100。您是否暗示 100 应该是应用于 SoretedRet 的最大或最小函数的结果?还是只是询问如何应用过滤器?

首先应用过滤器。结果是所有满足过滤条件的元素 (

ForEach 是应用于过滤结果的结果(即不应用于任何不符合过滤条件的元素)。

SortedSet<Integer> numbers = new TreeSet<Integer>();

    for (int index = 0; index < 100; index++) {
        numbers.add(index);
    }

    Stream<Integer> filterResult = numbers.parallelStream().filter(n -> n <= 9);

    System.out.println(filterResult.count());

但是,我不确定您在问什么?也许你可以详细说明。

更新: 请参阅此页面: http://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html

并行执行流

您可以串行或并行执行流。当一个流 并行执行,Java 运行时将流划分为 多个子流。聚合操作迭代和处理 这些子流并行,然后合并结果。

该操作将集合划分为并行任务,从而划分为集合的子部分。

此外,您始终可以仔细阅读源代码并验证实现是否符合您的期望。 JSR 是一种规范,对:) 不是一种实现。因此,从技术上讲,要回答您的问题,我们需要查看具体的实现。只是需要考虑的事情。

希望对你有帮助:) 祝你好运

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多