我目前正在为考试做准备,并且正在执行以下任务:
生成包含整数
DispatchGroup
的无限流。
以下流生成普通的无限流:
(0, 1, -1, 2, -2, 3, -3, ...)
是否存在同时生成正数和负数的方法或lambda表达式?
答案 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);