我目前正在为考试做准备,正在做以下工作:
生成包含整数
(0, 1, -1, 2, -2, 3, -3, ...)的无限流。
以下流生成一个正常的无限流:
Stream<Integer> infiniteStream = Stream.iterate(1, i -> i + 1);是否有既产生正数又产生负数的方法或lambda表达式?
发布于 2019-07-10 11:48:11
就像这样:
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));发布于 2019-07-10 12:01:04
我想提供一种替代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),但是它也可以在flatMap之后与limit一起工作。
有时,与其将“复杂性”放入生成公式中,还不如将其拆分并使用中间流操作,这可能是有意义的,也可能没有意义。如果你的思维过程是你交替的数字,使用Erans的答案。如果你认为,对于无限的自然数流,你想要重复每一个数与它的逆,而不是意图是更清楚地表达与选择。
编辑:要处理零,可以执行Stream.concat(Stream.of(0), alternative)
发布于 2019-07-11 10:45:45
如果你仔细观察下面的方案,它可能比你想象的要容易得多:
0 1 2 3 4 5
| | | | | |
0 1 (-1) 2 (-2) 3现在,你可以这样看待它:如果这个数字是偶数,结果就是这个指数除以二(减去那个);如果这个数字是奇数,结果就是这个指数除以二加一。
您可以通过简单地查看最后一位来判断这个数字是奇数还是偶数:如果是1 =>奇数;如果是0 =>偶数。你可以把一个数字除以二,把它移到右边一次,就这样:
IntStream.range(0, 10)
.map(x -> (x & 1) == 0 ? -(x >> 1) : (x >> 1) + 1)
.forEachOrdered(System.out::println);https://stackoverflow.com/questions/56970064
复制相似问题