具有已知界限的 Java Stream 最小值

标签 java performance collections java-stream minimum

<分区>

我有一个列表流,我想从中获取元素最少的条目。我当然可以做类似的事情

Stream<List<T>> s = ...
s.min((e1, e2) -> e1.size() - e2.size());

但在这种情况下,我们知道最小值的下限,因为大小是非负的。这意味着当找到大小为 0 的列表时,我们实际上可以停止,而不是遍历列表的其余部分。 这可以通过 Java Streams 以适当的方式实现吗?

我会想象它看起来像这样,提供一个比较器和一个函数来告诉我们当前最小值何时是全局最小值:

s.boundedMin(
    (e1, e2) -> e1.size() - e2.size(),
    e -> e.size() == 0
)

我想不出实现它的方法。

当然,我可以只使用 Iterable 并使用带有 break 语句的循环来获得它,我只是想知道流是否也可以让我到达那里。

编辑: 为了让它更清楚一点。流可能可能不包含大小为 0 的列表。我的问题是 min() 将贯穿整个流,即使它已经找到大小为 0 的列表(这已经是它所能达到的最小了)。因此,我正在寻找的是一种不需要扫描整个流的 min 实现,它通过提供最小值的下限来实现。

编辑2: 没有流的等效迭代解决方案是

List<List<T>> s = ...
List<T> min = null;
for (List<T> l : s) {
        if (min == null || min.size() > l.size())
            min = l;
        if (min.size() == 0) {
            break;
        }
}

最佳答案

只是为了好玩:

static <T> int size(Stream<List<T>> st) {

    class MinHolder implements Consumer<List<T>> {

        private int min = Integer.MAX_VALUE;

        public void accept(List<T> l) {
            if (min > l.size()) {
                min = l.size();
            }
        }
    }

    MinHolder holder = new MinHolder();
    Spliterator<List<T>> sp = st.spliterator();

    int elements = 0;
    for (; sp.tryAdvance(holder) && holder.min > 0; ++elements) {

    }

    System.out.printf("took %s elements to find the min%n", elements);
    return holder.min;
}

还有一些测试用例:

public static void main(String[] args) {
    Stream<List<Integer>> st = Stream.of(List.of());
    System.out.println(size(st));

    st = Stream.empty();
    System.out.println(size(st));

    st = Stream.of(List.of(), List.of(1), List.of(1, 2), List.of(1, 2, 3));
    System.out.println(size(st));
}

如果你不是被迫使用 Stream<List<T>>那就不要;这种有条件的中断不是 Streams 的设计目的,许多人会认为这是一种滥用。

关于具有已知界限的 Java Stream 最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57872679/

相关文章:

java - 使用断言检查元素是否在屏幕上,发生 NoSuchElementException

java - 如何获取字符串中第一个字母的位置

java - 如何将 Orchid (Tor Java Lib) 添加到我的项目中?

javascript - JS 图片加载性能

java - 使用匿名 Comparable 的 Collections.sort 出错

mongodb - 迄今为止在聚合框架中的 Mongoid

java - Scala 是否对小型集合使用特殊实现?

java - 检测 WebView 中的超链接悬停并打印链接

android - 10 秒后 Android 上 OpenGL ES 的 CPU 使用率大幅增加

database - 从 Oracle DB 检索大量小 BLOB(2-10kb)时要调整的参数?