>Java >java지도 시간 >조건자가 실패할 때까지 Java 8 스트림을 제한하는 방법은 무엇입니까?

조건자가 실패할 때까지 Java 8 스트림을 제한하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-20 17:59:10519검색

How to Limit a Java 8 Stream Until a Predicate Fails?

Java 8의 조건자를 기반으로 스트림 제한

Java 8 스트림 작업은 데이터를 조작하고 필터링하는 강력한 방법을 제공합니다. 그러나 첫 번째 요소가 주어진 조건에 실패할 때까지 잠재적으로 무한한 스트림을 제한하는 특정 작업이 부족합니다.

Java 9에서는 takeWhile 작업을 사용하여 이 동작을 달성할 수 있습니다. 예를 들어, takeWhile을 사용하여 10보다 작은 모든 숫자를 인쇄하려면 다음과 같이 작성할 수 있습니다.

IntStream
    .iterate(1, n -> n + 1)
    .takeWhile(n -> n < 10)
    .forEach(System.out::println);

하지만 takeWhile을 사용할 수 없는 Java 8은 어떻습니까? 이 경우 유사한 기능을 구현하는 여러 가지 접근 방식이 있습니다.

한 가지 방법은 필터 및 findFirst 작업을 사용하는 것입니다. 다음 코드 조각은 방법을 보여줍니다.

IntStream
    .iterate(1, n -> n + 1)
    .filter(n -> n < 10)
    .findFirst()
    .ifPresent(System.out::println);

이 솔루션은 조건자를 충족하지 않는 요소(이 경우 10보다 크거나 같은 숫자)를 필터링한 다음에서 첫 번째 나머지 요소를 찾는 방식으로 작동합니다. 스트림. 일치하는 요소가 없으면 findFirst는 빈 옵셔널을 반환하며 이 경우에는 무시됩니다.

또 다른 접근 방식은 조건자를 인수로 사용하는 사용자 정의 Stream.limitUntil 메서드를 사용합니다. 구현 예는 다음과 같습니다.

public static <T> Stream<T> limitUntil(Stream<T> stream, Predicate<? super T> predicate) {
    AtomicBoolean stop = new AtomicBoolean(false);
    return stream.takeWhile(t -> {
        boolean stopFlag = stop.get();
        if (!stopFlag) stopFlag = predicate.test(t);
        stop.set(stopFlag);
        return !stopFlag;
    });
}

이 방법은 다음과 같이 사용할 수 있습니다.

IntStream
    .iterate(1, n -> n + 1)
    .limitUntil(n -> n >= 10)
    .forEach(System.out::println);

위 내용은 조건자가 실패할 때까지 Java 8 스트림을 제한하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.