为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

犯罪嫌疑人X 2023-03-17 15:45:53
我目前正在准备考试并正在执行以下任务:生成包含整数的无限流(0, 1, -1, 2, -2, 3, -3, ...)。以下流生成正常的无限流:Stream<Integer> infiniteStream = Stream.iterate(1, i -> i + 1);是否有同时产生正数和负数的方法或 lambda 表达式?
查看完整描述

4 回答

?
Smart猫小萌

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));


查看完整回答
反对 回复 2023-03-17
?
牧羊人nacy

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)


查看完整回答
反对 回复 2023-03-17
?
30秒到达战场

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);


查看完整回答
反对 回复 2023-03-17
?
动漫人物

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);


查看完整回答
反对 回复 2023-03-17
  • 4 回答
  • 0 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信