Java 8에서 소개된 스트림(Stream)은 데이터 처리를 효율적으로 다룰 수 있는 강력한 도구입니다. 스트림을 활용하면 컬렉션(Collection)을 다루는 작업을 보다 간결하고 가독성 있게 처리할 수 있습니다. 이 중에서도 filter() 메서드는 스트림에서 원하는 요소들만을 선택적으로 추출하는데 사용됩니다. 이번 포스트에서 Java Stream의 filter() 메서드에 대해 자세히 알아보도록 하겠습니다.
filter() 메서드는 주어진 조건(Predicate)을 만족하는 요소들로 구성된 스트림을 반환합니다. 즉, 스트림에서 원하는 요소만을 추출하여 새로운 스트림을 생성하는 역할을 합니다. filter() 메서드는 스트림의 각 요소에 대해 조건을 적용하고, 조건을 만족하는 요소만을 결과 스트림에 포함시킵니다.
filter() 메서드는 다음과 같은 형태로 사용됩니다.
Stream<T> filter(Predicate<? super T> predicate)
다음은 filter() 메서드를 사용하여 정수 스트림에서 짝수만을 추출하는 예제입니다.
javaCopy code
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers); // [2, 4, 6, 8, 10]
위 예제에서는 먼저 정수 리스트를 생성하고, stream() 메서드를 사용하여 스트림을 생성합니다. 그리고 filter() 메서드를 호출하여 짝수인 요소들만을 추출하고, collect() 메서드를 사용하여 추출된 요소들을 리스트로 변환합니다. 최종적으로 evenNumbers 변수에는 짝수만을 포함하는 리스트가 저장되어 출력됩니다.
filter() 메서드는 다른 스트림 메서드들과 함께 사용할 수 있어 더욱 강력한 기능을 제공합니다. 예를 들어, map() 메서드와 함께 사용하여 스트림의 요소를 변환한 후에 조건을 적용할 수 있습니다.
javaCopy code
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream()
.map(String::toUpperCase)
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
System.out.println(filteredNames); // [ALICE]
위 예제에서는 문자열 리스트를 생성하고, map() 메서드를 사용하여 각 요소를 대문자로 변환한 후 filter() 메서드를 호출하여 "A"로 시작하는 요소만을 추출합니다. 그리고 collect() 메서드를 사용하여 추출된 요소들을 리스트로 저장하고 출력합니다. 따라서 "Alice"라는 요소만이 결과 리스트에 포함됩니다.
5. 결론
filter() 메서드는 Java Stream을 활용하여 요소를 조건에 맞게 필터링하는 데 유용한 기능을 제공합니다. 이를 통해 코드의 가독성과 효율성을 향상시킬 수 있습니다. filter() 메서드를 적절히 조합하면 다양한 데이터 처리 작업을 간결하고 명확하게 표현할 수 있으며, 이는 개발자의 생산성을 높여줍니다.