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);
添加回答
举报