프레디케이트로 필터링
List<Dish> vegetarianMenu = menu.stream()
.filter(Dish::isVegetarian)
.toList();
- Dish::isVegetarian → 메서드 참조를 사용 각 요리가 채식 요리인지 확인한다.
- 조건을 만족하는 요리들만을 포함하는 새로운 스트림이 생성..
- 최종적으로 리스트로 수집
프레디케이트를 사용한 필터링 성능
- 외부 반복과 성능 차이가 있을까?
- 차이가 거의 없긴함
- 다만 filter라는 중간 연산을 통하여 가독성이 좋아짐.
- limit 처리를 통하여 게으른 특성을 통해 불필요한 연산자체를 막을 순 있음.
고유 요소 필터링
- distinct 메서드로 고유 요소로 이루어진 스트림 반환가능
- 객체의 hashCode 및 equals 로 결정된다.
Stream.of(1, 2, 1, 3, 3, 2, 4)
.distinct()
.forEach(System.out::println);
1
2
3
4
distinct 성능
- 내부적으로 해시셋을 사용한다고 합니다.
- 요소의 수가 많아질 수록 성능에 영향을 미칠 순 있는데
- 해시셋은 내부적으로 해시 테이블로 구성되어있는데
- 특정 객체의 계산된 해시값이 ‘32’ 라면 해당 값을 가진 키를
- 상수 시간에 조회한다.
- 거의 성능 저하가 없음.
- 만약 같은 객체가 존재하면 (
hashCode
함수로 키 값 비교 )
equals
를 통해 실제로 동일한 객체인지를 다시 확인한다.