Stream.filter란?
filter는 특정 조건에 맞는 요소만을 추출하여 새로운 스트림을 생성하는 데 사용됩니다.
Predicate로 조건을 만들어서 filter 메서드에 매개변수로 넣어주면 조건에 맞는 요소만 가지고 새로운 스트림이 만들어집니다.
Java Stream Filter 메소드 공식 문서 바로가기
Stream.filter 기본 사용법
정수 리스트에서 짝수만 추출
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.stream()
.filter(num -> num % 2 == 0)
.forEach(num -> System.out.println(num));
정수 리스트에서 짝수만 뽑는 예제입니다.
Predicate 클래스는 함수형 인터페이스로, 조건식을 표현하는 데 사용됩니다.
예제처럼 num → num % 2 == 0과 같이 변수 → 구현의 형태를 가집니다.
글자수, 특정 문자 포함여부 필터링하여 추출
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("car");
list.add("dog");
list.add("elephant");
list.stream()
.filter(isLongerThan3().and(isContainE()))
.forEach(s -> System.out.println(s));
// ----------------------------------
private static Predicate<String> isLongerThan3() {
return s -> s.length() > 3;
}
private static Predicate<String> isContainE() {
return s -> s.contains("e");
}
위 예제에서는 두 개의 Predicate를 사용하여 3글자 초과하고 'e'를 포함하는 문자열만 추출합니다.
isLongerThan3와 isContainE 메서드는 각각 길이가 3을 초과하는지와 'e'를 포함하는지 확인하는 Predicate를 반환합니다.
이 두 조건을 and 메서드로 결합하여 필터링에 사용합니다.
이처럼 Predicate를 사용하면 여러 조건들로 Stream을 필터링할 수 있습니다.
filter 여러개 사용법
filter의 반환값은 Stream이기 때문에 여러개의 filter를 걸 수 있습니다.
List<Integer> list = new ArrayList<>();
for (int i = 1; i <= 50; i++) {
list.add(i);
}
list.stream()
.filter(n -> n % 2 == 0)
.filter(n -> n % 3 == 0)
.filter(n -> n % 5 == 0)
.forEach(n -> System.out.println(n));
위 예제에서는 여러 개의 필터를 연속으로 사용하여 조건을 좁혀 나갑니다.
리스트에서 짝수만 추출하고, 그 중에서 3의 배수를 추출하며, 최종적으로 5의 배수만 추출합니다.
복잡한 조건 필터링
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
...
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("apricot");
list.add("avocado");
list.add("cherry");
list.stream()
.filter(startsWithA().and(hasLengthMoreThan5()))
//----------------------------------------------------------------
private static Predicate<String> startsWithA() {
return s -> s.startsWith("a");
}
private static Predicate<String> hasLengthMoreThan5() {
return s -> s.length() > 5;
}
위 예제에서는 'a'로 시작하고 길이가 5를 초과하는 문자열을 필터링합니다.
startsWithA와 hasLengthMoreThan5 메서드는 각각 'a'로 시작하는지와 길이가 5를 초과하는지 확인하는 Predicate를 반환합니다.
이처럼 filter를 연속으로 사용해도 되고, Predicate로 조건을 여러 개 사용할 수도 있습니다.
읽으면 좋은 글