有没有一种“计算性”的快速方法来获得迭代器的计数?
int i = 0;
for ( ; some_iterator.hasNext() ; ++i ) some_iterator.next();
..。这似乎是对CPU周期的浪费。
发布于 2014-11-11 21:51:51
发布于 2018-01-12 02:52:50
您将始终需要迭代。但是,您可以使用Java 8、9来执行计数,而无需显式地循环:
Iterable<Integer> newIterable = () -> iter;
long count = StreamSupport.stream(newIterable.spliterator(), false).count();
下面是一个测试:
public static void main(String[] args) throws IOException {
Iterator<Integer> iter = Arrays.asList(1, 2, 3, 4, 5).iterator();
Iterable<Integer> newIterable = () -> iter;
long count = StreamSupport.stream(newIterable.spliterator(), false).count();
System.out.println(count);
}
这将打印:
5
有趣的是,您可以通过更改此调用的parallel
标志来并行化count操作:
long count = StreamSupport.stream(newIterable.spliterator(), *true*).count();
发布于 2015-10-06 20:08:42
使用Guava library时,另一种选择是将Iterable
转换为List
。
List list = Lists.newArrayList(some_iterator);
int count = list.size();
如果您还需要在获取迭代器的大小后访问其元素,请使用此选项。通过使用Iterators.size()
,您不再能够访问迭代的元素。
https://stackoverflow.com/questions/9720195
复制相似问题