4 回答

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

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊
我想提供一個(gè)替代 Erans 答案的方法。
由于您已經(jīng)知道基本的無(wú)限流是如何工作的,因此您可以使用進(jìn)一步的流操作,例如flatMap在它的基礎(chǔ)上構(gòu)建:
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請(qǐng)注意,這僅在延遲評(píng)估時(shí)才有效。我把 放在limit那里,這樣我就可以在某個(gè)結(jié)果 ( toList) 中收集它,但它也適用limit于flatMap.
有時(shí),與其將“復(fù)雜性”放入您的生成公式中,不如將其拆分并使用中間流操作可能有意義也可能沒(méi)有意義。如果您的思維過(guò)程是交替數(shù)字,請(qǐng)使用 Erans 答案。如果你寧愿認(rèn)為對(duì)于無(wú)限的自然數(shù)流,你想用它的倒數(shù)復(fù)制每個(gè)數(shù)字,而不是用替代方案更清楚地傳達(dá)意圖。
編輯:要處理零,你可以做Stream.concat(Stream.of(0), alternative)

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

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果你想讓負(fù)數(shù)引出一對(duì)整數(shù)并顯示 -1,1,-2,2,-3,3,.. 你并執(zhí)行此操作。
IntStream.iterate(1, i -> i + 1).flatMap(a -> IntStream.of(-a, a));
IntStream.iterate(-1,i -> i < 0 ? -i: -i - 1);
添加回答
舉報(bào)