Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9 Stream API의 takeWhile()과 dropWhile() 메서드, 무엇이 다를까?

Java 9에서 도입된 Stream API에는 조건(술어)을 기반으로 스트림 요소를 처리하는 두 가지 유용한 메서드가 있습니다. 바로 takeWhile()dropWhile()입니다. 두 메서드는 이름이 비슷하지만 동작 방식이 정반대이며, 이를 정확히 이해하면 스트림 데이터를 훨씬 유연하게 다룰 수 있습니다.

핵심 차이점 한눈에 보기

  • takeWhile(): 술어(predicate)가 false를 반환할 때까지 스트림의 모든 값을 취득합니다.
  • dropWhile(): 술어와 일치하는 동안 스트림의 모든 값을 버립니다.

스트림이 정렬된(ordered) 경우, takeWhile()은 술어와 일치하는 요소들의 가장 긴 접두사(longest prefix)로 구성된 스트림을 반환하고, dropWhile()은 술어와 일치한 지점 이후의 나머지 스트림을 반환합니다.

반면 스트림이 정렬되지 않은(unordered) 경우, takeWhile()은 주어진 술어와 일치하는 요소들의 부분 집합으로 구성된 스트림을 반환하며, dropWhile()은 술어와 일치하는 요소들의 부분 집합을 제거한 뒤 남은 요소들로 구성된 스트림을 반환합니다.

takeWhile() 문법

default Stream<T> takeWhile(Predicate<? super T> predicate)

예제 코드

import java.util.stream.Stream;

public class TakeWhileMethodTest {
    public static void main(String args[]) {
        Stream.of("India", "Australia", "Newzealand", "", "South Africa", "England")
              .takeWhile(o -> !o.isEmpty())
              .forEach(System.out::print);
    }
}

실행 결과

IndiaAustraliaNewzealand

위 예제에서는 각 요소가 빈 문자열이 아닌지 검사합니다. 네 번째 요소인 빈 문자열("")을 만나는 순간 술어가 false를 반환하므로, 그 이전의 세 요소("India", "Australia", "Newzealand")만 출력되고 나머지는 무시됩니다.

dropWhile() 문법

default Stream<T> dropWhile(Predicate<? super T> predicate)

예제 코드

import java.util.stream.Stream;

public class DropWhileMethodTest {
    public static void main(String args[]) {
        Stream.of("India", "Australia", "Newzealand", "", "England", "Srilanka")
              .dropWhile(o -> !o.isEmpty())
              .forEach(System.out::print);
        System.out.println();

        Stream.of("India", "", "Australia", "", "England", "Srilanka")
              .dropWhile(o -> !o.isEmpty())
              .forEach(System.out::print);
    }
}

실행 결과

EnglandSrilanka
AustraliaEnglandSrilanka

첫 번째 스트림에서는 빈 문자열이 나타날 때까지의 요소들("India", "Australia", "Newzealand")이 모두 버려지고, 빈 문자열 이후의 요소들만 출력됩니다. 두 번째 스트림 역시 첫 번째 빈 문자열 앞의 "India"만 제거되고 나머지 요소들이 출력됩니다.

이처럼 dropWhile()은 조건이 처음으로 깨지는 지점부터 나머지 요소를 처리한다는 점이 핵심입니다. 즉, takeWhile()은 '조건이 참인 동안 가져오기', dropWhile()은 '조건이 참인 동안 건너뛰기'라고 기억하면 두 메서드의 동작을 쉽게 구분할 수 있습니다.