IT박스

Java 8로 무한 스트림을 만드는 방법

itboxs 2020. 11. 15. 11:03
반응형

Java 8로 무한 스트림을 만드는 방법


외부 라이브러리없이 사용하여 무한 스트림을 만드는 쉬운 방법이 있습니까?

예를 들어 Scala에서 :

Iterator.iterate(0)(_ + 2)

예, 쉬운 방법이 있습니다.

IntStream.iterate(0, i -> i + 2);

사용 사례로 :

IntStream.iterate(0, i -> i + 2)
         .limit(100)
         .forEach(System.out::println);

2 단계로 증가하는 0에서 198까지 인쇄합니다.

일반적인 방법은 다음과 같습니다.

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()당신에게 무작위 정수의 무한 스트림을 제공한다.


Java 8 에는 또 다른 가능한 솔루션이 있습니다 .

AtomicInteger adder = new AtomicInteger();
IntStream stream = IntStream.generate(() -> adder.getAndAdd(2));

중요 : 숫자 순서는 스트림이 순차적 인 경우에만 유지됩니다.


의 새 버전이 Java 9IntStream.iterate 이후 추가 되었다는 점도 주목할 가치가 있습니다 .

static IntStream iterate​(int seed,
                         IntPredicate hasNext,
                         IntUnaryOperator next);
  • seed- 초기 요소;
  • hasNext- 스트림이 종료되어야하는시기를 결정하기 위해 요소에 적용 할 술어.
  • next- 새 요소를 생성하기 위해 이전 요소에 적용 할 함수.

예 :

IntStream stream = IntStream.iterate(0, i -> i >= 0, i -> i + 2);

IntStream.iterate(0, i -> i < 10, i -> i + 2).forEach(System.out::println);

스트림과 소비자를 구현하여 고유 한 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

참고 URL : https://stackoverflow.com/questions/22483554/how-to-create-an-infinite-stream-with-java-8

반응형