【发布时间】:2015-06-02 13:17:34
【问题描述】:
这不是斐波那契流。
LongStream digits = LongStream.of(0, 1, 2 , 3 , 4, 5, 6, 7, 8, 9);
这也不是。
LongStream naturals = LongStream.iterate(1, (i) -> i + 1);
但是,您如何检查它们是否不是?
注意第二个流是无限的,所以你需要一些短路操作来尽快停止。不幸的是,短路方法 'allMatch' 和 'anyMatch' 只测试元素,而不是序列。
【问题讨论】:
-
我看不出你如何测试无限流是斐波那契流。即使您按照斐波那契数列测试前 1,000,000 个元素,也无法保证第 1,000,001 个元素会遵循。
-
如果提供了
zip方法,您可以使用boolean same = zip(fib.boxed(), naturals.boxed(), (a, b) -> a.equals(b)).allMatch(x -> x == true);之类的方法(注意(a, b) -> a.equals(b)可以简化为Objects::equals)。你可以检查这个线程:stackoverflow.com/questions/17640754/… 但是对于无限流,你可以limit之前的流,但这并不是因为 n-1 个元素等于第 n 个元素...... -
如果它是一个问题,忘记无限流。我说这只是为了强制对您的答案进行短路操作:P。事实上,我不介意斐波那契。我可以问下一个问题:“你如何测试一个流是有序的而不需要迭代它的所有元素?”
-
这取决于。您可以尝试抓取 Stream 的 spliterator 并查看它是否具有 SORTED 特征。否则,恐怕唯一的方法就是遍历所有元素。对于任何序列,在您按照遇到的顺序比较所有元素之前,您无法知道它是否已排序。
-
@atalarico 鉴于您收到的关于无限流和确定顺序等的建议,您现在有什么问题?
标签: java-8 java-stream short-circuiting