4 回答

TA貢獻1911條經驗 獲得超7個贊
是這樣的:
Stream<Integer> infiniteStream = Stream.iterate(1, i -> i > 0 ? -i : (-i + 1));
或者,如果你想開始0
:
Stream<Integer> infiniteStream = Stream.iterate(0, i -> i > 0 ? -i : (-i + 1));
當然,這也可以通過以下方式完成IntStream
:
IntStream infiniteStream = IntStream.iterate(0, i -> i > 0 ? -i : (-i + 1));

TA貢獻1862條經驗 獲得超7個贊
我想提供一個替代 Erans 答案的方法。
由于您已經知道基本的無限流是如何工作的,因此您可以使用進一步的流操作,例如flatMap在它的基礎上構建:
final Stream<Integer> eransAnswer = Stream.iterate(1, i -> i > 0 ? -i : (-i + 1));
final Stream<Integer> alternative = Stream.iterate(1, i -> i + 1)
.flatMap(i -> Stream.of(i, -i));
System.out.println(eransAnswer.limit(6).collect(Collectors.toList()));
System.out.println(alternative.limit(6).collect(Collectors.toList()));
flatMap請注意,這僅在延遲評估時才有效。我把 放在limit那里,這樣我就可以在某個結果 ( toList) 中收集它,但它也適用limit于flatMap.
有時,與其將“復雜性”放入您的生成公式中,不如將其拆分并使用中間流操作可能有意義也可能沒有意義。如果您的思維過程是交替數字,請使用 Erans 答案。如果你寧愿認為對于無限的自然數流,你想用它的倒數復制每個數字,而不是用替代方案更清楚地傳達意圖。
編輯:要處理零,你可以做Stream.concat(Stream.of(0), alternative)

TA貢獻1828條經驗 獲得超6個贊
如果您仔細觀察下面的方案,它可能比您想象的要容易得多:
0 1 2 3 4 5
| | | | | |
0 1 (-1) 2 (-2) 3
現在,您可以這樣看:如果數字是偶數,則結果是該索引除以二(并減去它);如果數字是奇數,則結果是該索引除以 2 加 1。
您可以通過簡單地查看最后一位來判斷數字是奇數還是偶數:if it is 1=> odd; 如果它是0=> 偶數。您可以通過將數字向右移動一次來將數字除以二,如下所示:
IntStream.range(0, 10)
.map(x -> (x & 1) == 0 ? -(x >> 1) : (x >> 1) + 1)
.forEachOrdered(System.out::println);

TA貢獻1815條經驗 獲得超10個贊
如果你想讓負數引出一對整數并顯示 -1,1,-2,2,-3,3,.. 你并執行此操作。
IntStream.iterate(1, i -> i + 1).flatMap(a -> IntStream.of(-a, a));
IntStream.iterate(-1,i -> i < 0 ? -i: -i - 1);
添加回答
舉報