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

时间:2019-07-10 11:46:19

标签: java eclipse java-8 java-stream

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

  

生成包含整数DispatchGroup的无限流。

以下流生成普通的无限流:

(0, 1, -1, 2, -2, 3, -3, ...)

是否存在同时生成正数和负数的方法或lambda表达式?

4 个答案:

答案 0 :(得分: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));

答案 1 :(得分:3)

我想提供一个替代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)

答案 2 :(得分:2)

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

0  1   2    3    4    5

|  |   |    |    |    |

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

现在,您可以这样看:如果数字是 even ,则结果是该索引除以2(并减去该值);如果数字为 odd ,则结果是该索引除以2加1。

只需查看最后一位就可以判断数字是奇数还是偶数:如果是1 =>奇数;如果是0 =>甚至。您可以通过将数字右移一次将其除以二,例如:

IntStream.range(0, 10)
         .map(x -> (x & 1) == 0 ? -(x >> 1) : (x >> 1) + 1)
         .forEachOrdered(System.out::println);

答案 3 :(得分:1)

如果您想让负数引出一对整数并显示-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);