qt4.8创建.pri
Tagir Valeev关于Stack Overflow的一个有趣问题最近引起了我的注意。 为了简短起见(请阅读问题的详细信息),而以下代码则有效:
public static Stream<Long> 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 Iterator<T> iterator = new Iterator<T>() {@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.html
qt4.8创建.pri