生成一个包含整数 (0, 1, -1, 2, -2, 3, -3, ...) 的无限 Stream

我目前正在准备考试并正在执行以下任务:

生成包含整数的无限流(0, 1, -1, 2, -2, 3, -3, ...)

以下流生成正常的无限流:

Stream<Integer> infiniteStream = Stream.iterate(1, i -> i + 1);

是否有同时产生正数和负数的方法或 lambda 表达式?


犯罪嫌疑人X
浏览 142回答 4
4回答

Smart猫小萌

是这样的:Stream<Integer>&nbsp;infiniteStream&nbsp;=&nbsp;Stream.iterate(1,&nbsp;i&nbsp;->&nbsp;i&nbsp;>&nbsp;0&nbsp;?&nbsp;-i&nbsp;:&nbsp;(-i&nbsp;+&nbsp;1));或者,如果你想开始0:Stream<Integer>&nbsp;infiniteStream&nbsp;=&nbsp;Stream.iterate(0,&nbsp;i&nbsp;->&nbsp;i&nbsp;>&nbsp;0&nbsp;?&nbsp;-i&nbsp;:&nbsp;(-i&nbsp;+&nbsp;1));当然,这也可以通过以下方式完成IntStream:IntStream&nbsp;infiniteStream&nbsp;=&nbsp;IntStream.iterate(0,&nbsp;i&nbsp;->&nbsp;i&nbsp;>&nbsp;0&nbsp;?&nbsp;-i&nbsp;:&nbsp;(-i&nbsp;+&nbsp;1));

牧羊人nacy

我想提供一个替代 Erans 答案的方法。由于您已经知道基本的无限流是如何工作的,因此您可以使用进一步的流操作,例如flatMap在它的基础上构建:&nbsp; &nbsp; final Stream<Integer> eransAnswer = Stream.iterate(1, i -> i > 0 ? -i : (-i + 1));&nbsp; &nbsp; final Stream<Integer> alternative = Stream.iterate(1, i -> i + 1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .flatMap(i -> Stream.of(i, -i));&nbsp; &nbsp; System.out.println(eransAnswer.limit(6).collect(Collectors.toList()));&nbsp; &nbsp; System.out.println(alternative.limit(6).collect(Collectors.toList()));flatMap请注意,这仅在延迟评估时才有效。我把 放在limit那里,这样我就可以在某个结果 ( toList) 中收集它,但它也适用limit于flatMap.有时,与其将“复杂性”放入您的生成公式中,不如将其拆分并使用中间流操作可能有意义也可能没有意义。如果您的思维过程是交替数字,请使用 Erans 答案。如果你宁愿认为对于无限的自然数流,你想用它的倒数复制每个数字,而不是用替代方案更清楚地传达意图。编辑:要处理零,你可以做Stream.concat(Stream.of(0), alternative)

30秒到达战场

如果您仔细观察下面的方案,它可能比您想象的要容易得多:0&nbsp; 1&nbsp; &nbsp;2&nbsp; &nbsp; 3&nbsp; &nbsp; 4&nbsp; &nbsp; 5|&nbsp; |&nbsp; &nbsp;|&nbsp; &nbsp; |&nbsp; &nbsp; |&nbsp; &nbsp; |0&nbsp; 1&nbsp; (-1)&nbsp; 2&nbsp; &nbsp;(-2)&nbsp; 3现在,您可以这样看:如果数字是偶数,则结果是该索引除以二(并减去它);如果数字是奇数,则结果是该索引除以 2 加 1。您可以通过简单地查看最后一位来判断数字是奇数还是偶数:if it is 1=> odd; 如果它是0=> 偶数。您可以通过将数字向右移动一次来将数字除以二,如下所示:IntStream.range(0, 10)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.map(x -> (x & 1) == 0 ? -(x >> 1) : (x >> 1) + 1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.forEachOrdered(System.out::println);

动漫人物

如果你想让负数引出一对整数并显示 -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);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java