filter 메서드
Stream 클래스에서 제공하는 filter() 메서드는 스트림 요소를 순회하면서 특정 조건을 만족하는 요소로 구성된 새로운 스트림을 반환합니다.
Stream<T> filter(Predicate<? super T> condition);
filter 메서드 특징
- filter() 메서드는 중개 연산(intermediate operation)을 수행하므로 새로운 스트림을 생성합니다.
- 특정 조건을 만족하는 요소로 구성된 새로운 스트림을 생성합니다.
- filter() 메서드의 매개변수는 함수형 인터페이스인 Predicate입니다. 따라서, 람다 표현식도 전달할 수 있습니다.
- filter() 메서드의 매개변수에는 한 개의 매개변수를 가지며, Boolean 타입의 값을 반환하는 람다 표현식 또는 Predicate 타입의 객체가 전달되어야 합니다.
예제 1. 짝수 가져오기
다음 예제는 Interger 타입의 List를 스트림으로 변환 후 filter() 메서드를 사용하여 짝수인 값으로 구성된 새로운 스트림을 생성합니다.
public static void main(String args[]) {
List<Integer> intList =
new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8));
Stream<Integer> filterResult =
intList.stream().filter(item -> item % 2 == 0);
filterResult.forEach(System.out::println);
}
[실행 결과]
2
4
6
8
예제 2. 필터링 기준이 여러 개인 경우
필터링 기준이 여러 개인 경우(조건식이 많은 경우) filter() 메서드를 사용하여 코드를 간략하게 작성할 수 있습니다.
다음 예제는 String 타입의 List를 스트림으로 변환 후 아래 조건을 만족하는 문자열로 구성된 새로운 스트림을 생성합니다.
[조건문]
- 문자열의 첫 문자가 "A"인 경우
- 문자열의 마지막 문자가 "Z"인 경우
- 문자열의 길이가 3 이상인 경우
public static void main(String args[]) {
String[] strArray = {"ABC", "BAZ", "AZ", "ABCZ", "CC"};
List<String> strList =
new ArrayList<>(Arrays.asList(strArray));
Stream<String> filterResult =
strList.stream().filter((item) -> {
return item.startsWith("A") && item.endsWith("Z") && item.length() >= 3;
});
filterResult.forEach(System.out::println);
}
[실행 결과]
ABCZ
예제 3. filter 메서드 반환 결과를 List로 변환
filter() 메서드는 새로운 스트림을 반환합니다. 스트림이 아닌 List로 반환받고 싶다면, filter() 메서드 뒤에 Collectors.toList()를 매개변수로 가지는 collect() 메서드를 호출합니다.
다음 예제는 짝수로 구성된 새로운 스트림을 List로 변환합니다.
public static void main(String args[]) {
List<Integer> intList =
new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8));
List<Integer> intStreamToList =
intList.stream().filter(item -> item % 2 == 0).collect(Collectors.toList());
intStreamToList.forEach(System.out::println);
}
[실행 결과]
2
4
6
8
예제 4. filter 메서드와 map 메서드 호출
filter() 메서드에서 반환된 스트림의 각 요소를 변경하고 싶은 경우 filter() 메서드 뒤에 map() 메서드를 호출합니다.
map() 메서드는 스트림을 순회하여 요소를 변경합니다.
다음 예제는 filter() 메서드에서 반환된 스트림 요소에 10을 곱한 뒤 List로 변환합니다.
public static void main(String args[]) {
List<Integer> intList =
new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8));
List<Integer> intStreamToList =
intList.stream()
.filter(item -> item % 2 == 0)
.map(item -> item * 10)
.collect(Collectors.toList());
intStreamToList.forEach(System.out::println);
}
[실행 결과]
20
40
60
80
'Java > 스트림(Stream)' 카테고리의 다른 글
[Java]스트림을 배열로 변환하는 방법(Stream to Array) (0) | 2022.09.05 |
---|---|
[Java]Stream 합치는 방법 - concat 메서드 (0) | 2022.08.26 |
[Java]Stream 중복 제거하는 방법 - distinct 메서드 (0) | 2022.08.26 |
[Java]anyMatch, allMatch, noneMatch 메서드 정리 (0) | 2022.08.26 |
[Java]Stream 특정 조건을 만족하는지 확인하는 방법 - noneMatch 메서드 (0) | 2022.08.25 |
댓글