gpt4 book ai didi

java - 是否可以创建在单个操作中计算其元素的 Stream 实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:04:34 25 4
gpt4 key购买 nike

问:是否可以创建 Stream 实现,在单个操作中对它们的元素进行计数,而不是对流中的每个元素进行计数?

当我试图比较列表中的两种方法时,我想到了这个:

  • 大小()

  • count()

Stream::count 终端操作计算流中元素的数量。操作的复杂度通常为 O(N),这意味着子操作的数量与 Stream 中的元素数量成正比。

List::size 方法的复杂度为O(1),这意味着无论 List 中的元素数量如何,size( ) 方法将在常数时间内返回。

   List<Integer> list = IntStream.range(0, 100).boxed().collect(toList());
System.out.println(list.size());
System.out.println(list.stream().count());

size()count() 花费的时间相对少,所以有没有任何可能的方法来创建 Stream 实现,在单个操作中计算它们的元素并使O(1) 的复杂度 ??


编辑 Article to answer Yes :

It is possible to create Stream implementation that counts their elements in a single operation O(1) rather than counting each and every element in the stream. This can improve performance significantly, especially for streams with many elements.

最佳答案

这已经在 J​​ava 9 和更新版本中发生了(考虑到 OpenJDK 实现,它也是 Oracle 的 JDK 的基础)。

如果你想要类似的操作,你可以使用,例如

public static long count(BaseStream<?,?> s) {
Spliterator<?> sp = s.spliterator();
long c = sp.getExactSizeIfKnown();
if(c >= 0) return c;
final class Counter implements Consumer<Object>,
IntConsumer, LongConsumer, DoubleConsumer { // avoid boxing where possible
long count;
public void accept(Object t) { count++; }
public void accept(int value) { count++; }
public void accept(long value) { count++; }
public void accept(double value) { count++; }
}
Counter c = new Counter();
sp.forEachRemaining(c);
return c.count;
}

你可以检查它不会处理所有元素

System.out.println(count(IntStream.range(0, 100).peek(System.out::println)));
System.out.println(count(Stream.of("a", "b", "c").peek(System.out::println)));

而插入一个filter操作

System.out.println(count(Stream.of("a", "b", "c")
.peek(System.out::println).filter(x -> true)));

将使计数不可预测并需要遍历。

如上所述,在 JDK 9 或更新版本中,您可以简单地使用

System.out.println(Stream.of("a", "b", "c").peek(System.out::println).count());

System.out.println(Stream.of("a", "b", "c")
.peek(System.out::println).filter(x -> true).count());

看到当计数可预测时遍历不会发生。

关于java - 是否可以创建在单个操作中计算其元素的 Stream 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55628859/

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