公司做网站的优势,贵阳网站建设公司哪家好,白品网站建设,建筑模拟2015qt4.8创建.priTagir Valeev关于Stack Overflow的一个有趣问题最近引起了我的注意。 为了简短起见#xff08;请阅读问题的详细信息#xff09;#xff0c;而以下代码则有效#xff1a; public static StreamLong longs() {return Stream.iterate(1L, i -1L l… qt4.8创建.pri Tagir Valeev关于Stack Overflow的一个有趣问题最近引起了我的注意。 为了简短起见请阅读问题的详细信息而以下代码则有效 public static StreamLong longs() {return Stream.iterate(1L, i -1L longs().skip(i - 1L).findFirst().get());
}longs().limit(5).forEach(System.out::println); 印刷 1
2
3
4
5 以下类似代码将不起作用 public static LongStream longs() {return LongStream.iterate(1L, i -1L longs().skip(i - 1L).findFirst().getAsLong());
} 导致StackOverflowError 。 当然这种递归迭代不是最佳的。 它不是Java 8之前的版本当然也没有新的API。 但是有人可能认为它至少应该起作用对吗 之所以不起作用是因为Java 8中的两个iterate()方法之间的细微实现差异。虽然引用类型流的Iterator首先返回seed 然后才通过对前一个应用迭代函数来进行迭代。值 final IteratorT iterator new IteratorT() {SuppressWarnings(unchecked)T t (T) Streams.NONE;Overridepublic boolean hasNext() {return true;}Overridepublic T next() {return t (t Streams.NONE) ? seed : f.apply(t);}
}; LongStream.iterate()版本和其他原始流不是这种情况 final PrimitiveIterator.OfLong iterator new PrimitiveIterator.OfLong() {long t seed;Overridepublic boolean hasNext() {return true;}Overridepublic long nextLong() {long v t;t f.applyAsLong(t);return v;}
}; 迭代功能已经预先预取一个值。 这通常不是问题但可能导致 迭代函数昂贵时的优化问题 递归使用迭代器时的无限递归 作为一种解决方法最好避免在原始类型流中使用此方法简单地进行递归。 幸运的是JDK 9中的修复已在进行中作为功能增强的副作用 https : //bugs.openjdk.java.net/browse/JDK-8072727 翻译自: https://www.javacodegeeks.com/2016/03/watch-recursion-java-8s-primitivestream-iterate.htmlqt4.8创建.pri