Я хочу предоставить альтернативу ответу 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)