首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成包含整数(0,1,-1,2,-2,3,-3,.)的无限Stream<Integer>

生成包含整数(0,1,-1,2,-2,3,-3,.)的无限Stream<Integer>
EN

Stack Overflow用户
提问于 2019-07-10 11:46:19
回答 4查看 729关注 0票数 6

我目前正在为考试做准备,正在做以下工作:

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

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

代码语言:javascript
运行
复制
Stream<Integer> infiniteStream = Stream.iterate(1, i -> i + 1);

是否有既产生正数又产生负数的方法或lambda表达式?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-07-10 11:48:11

就像这样:

代码语言:javascript
运行
复制
Stream<Integer> infiniteStream = Stream.iterate(1, i -> i > 0 ? -i : (-i + 1));

或者,如果您想从0开始

代码语言:javascript
运行
复制
Stream<Integer> infiniteStream = Stream.iterate(0, i -> i > 0 ? -i : (-i + 1));

当然,这也可以用IntStream来完成。

代码语言:javascript
运行
复制
IntStream infiniteStream = IntStream.iterate(0, i -> i > 0 ? -i : (-i + 1));
票数 7
EN

Stack Overflow用户

发布于 2019-07-10 12:01:04

我想提供一种替代Erans答案的方法。

由于您已经知道了基本的无限流是如何工作的,所以可以使用进一步的流操作(如flatMap )来构建它:

代码语言:javascript
运行
复制
    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),但是它也可以在flatMap之后与limit一起工作。

有时,与其将“复杂性”放入生成公式中,还不如将其拆分并使用中间流操作,这可能是有意义的,也可能没有意义。如果你的思维过程是你交替的数字,使用Erans的答案。如果你认为,对于无限的自然数流,你想要重复每一个数与它的逆,而不是意图是更清楚地表达与选择。

编辑:要处理零,可以执行Stream.concat(Stream.of(0), alternative)

票数 3
EN

Stack Overflow用户

发布于 2019-07-11 10:45:45

如果你仔细观察下面的方案,它可能比你想象的要容易得多:

代码语言:javascript
运行
复制
0  1   2    3    4    5

|  |   |    |    |    |

0  1  (-1)  2   (-2)  3

现在,你可以这样看待它:如果这个数字是偶数,结果就是这个指数除以二(减去那个);如果这个数字是奇数,结果就是这个指数除以二加一。

您可以通过简单地查看最后一位来判断这个数字是奇数还是偶数:如果是1 =>奇数;如果是0 =>偶数。你可以把一个数字除以二,把它移到右边一次,就这样:

代码语言:javascript
运行
复制
IntStream.range(0, 10)
         .map(x -> (x & 1) == 0 ? -(x >> 1) : (x >> 1) + 1)
         .forEachOrdered(System.out::println);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56970064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档