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 중국어 웹사이트의 기타 관련 기사를 참조하세요!