Есть ли простой способ создания потока бесконечности с помощью java-8 без внешних библиотек?
Например, в Scala:
Iterator.iterate(0)(_ + 2)
Есть ли простой способ создания потока бесконечности с помощью java-8 без внешних библиотек?
Например, в Scala:
Iterator.iterate(0)(_ + 2)
Да, существует легкий способ:
IntStream.iterate(0, i -> i + 2);
С помощью usecase:
IntStream.iterate(0, i -> i + 2)
.limit(100)
.forEach(System.out::println);
который печатает от 0 до 198, увеличивая с шагом 2.
Общий метод:
Stream.iterate(T seed, UnaryOperator<T> f);
Последнее может быть более необычным в использовании.
Вот пример:
PrimitiveIterator.OfInt it = new PrimitiveIterator.OfInt() {
private int value = 0;
@Override
public int nextInt() {
return value++;
}
@Override
public boolean hasNext() {
return true;
}
};
Spliterator.OfInt spliterator = Spliterators.spliteratorUnknownSize(it,
Spliterator.DISTINCT | Spliterator.IMMUTABLE |
Spliterator.ORDERED | Spliterator.SORTED);
IntStream stream = StreamSupport.intStream(spliterator, false);
Это немного подробный, как вы видите. Чтобы напечатать первые 10 элементов этого потока:
stream.limit(10).forEach(System.out::println);
Вы также можете преобразовать элементы, как в примере Scala:
IntStream plusTwoStream = stream.map(n -> n + 2);
Обратите внимание, что есть встроенные бесконечные потоки, такие как java.util.Random.ints()
, который дает вам бесконечный поток случайных целых чисел.
Вы можете создать свой собственный InfiniteStream, внедряя поток и потребитель и составляя оба, и может потребоваться очередь для очереди в ваших данных как:
public class InfiniteStream<T> implements Consumer<T>, Stream<T> {
private final Stream<T> stream;
private final Queueing q;
...
public InfiniteStream(int length) {
this.q = new Queueing(this.length);
this.stream = Stream.generate(q);
...
}
//implement stream methods
//implement accept
}
проверить полный код здесь https://gist.github.com/bassemZohdy/e5fdd56de44cea3cd8ff