日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

注意Java 8的[Pri​​mitive] Stream.iterate()中的递归

發(fā)布時間:2023/12/3 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 注意Java 8的[Pri​​mitive] Stream.iterate()中的递归 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Tagir Valeev關(guān)于Stack Overflow的一個有趣問題最近引起了我的注意。 為了簡短起見(請閱讀問題的詳細(xì)信息),而以下代碼則有效:

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()); }

導(dǎo)致StackOverflowError 。

當(dāng)然,這種遞歸迭代不是最佳的。 它不是Java 8之前的版本,當(dāng)然也沒有新的API。 但是有人可能認(rèn)為它至少應(yīng)該起作用,對嗎? 之所以不起作用,是因為Java 8中的兩個iterate()方法之間的細(xì)微實現(xiàn)差異。雖然引用類型流的Iterator首先返回seed ,然后才通過將迭代函數(shù)應(yīng)用于前一個繼續(xù)進(jìn)行迭代。值:

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;} };

迭代功能已預(yù)先預(yù)取一個值。 這通常不是問題,但可能導(dǎo)致

  • 迭代函數(shù)昂貴時的優(yōu)化問題
  • 遞歸使用迭代器時的無限遞歸
  • 作為一種解決方法,最好避免在原始類型流中使用此方法簡單地進(jìn)行遞歸。 幸運(yùn)的是,JDK 9中的修復(fù)已在進(jìn)行中(作為功能增強(qiáng)的副作用): https : //bugs.openjdk.java.net/browse/JDK-8072727

    翻譯自: https://www.javacodegeeks.com/2016/03/watch-recursion-java-8s-primitivestream-iterate.html

    總結(jié)

    以上是生活随笔為你收集整理的注意Java 8的[Pri​​mitive] Stream.iterate()中的递归的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。