-
[Spring] stream에서 .findAny()는 순서에 무관하게 하나만 찾고 반환한다.Spring 2023. 7. 21. 13:55728x90
스프링 코드를 짜던 중 .findAny()라는 메서드를 발견했다.
이 메서드는 주어진 값에서 요구사항에 맞는 값을 하나라도 찾는 작업이다.
주어진 값을 모두 조사했으나 없을 경우 반환타입이 Optional이기 때문에 Optional.empty()로 반환된다.
그럼 찾으려는 값이 원본대상에 2개 이상 있을 경우에는 어떨까?
찾으려는 대상: AA
원본 store에 있는 값 = {1,"AA"}, {2, "AA"}.findAny() 메서드는 병렬 스트림이 아닌 경우에도 보통 스트림의 순서와 상관없이 일치하는 요소를 찾으면 처리를 멈추고 해당 요소를 반환한다. 따라서 "AA" 값이 2개 있는 경우에도 .findAny()를 사용하면 두 개 중 하나의 "AA" 값만 반환될 것이다.
스트림은 일반적으로 순서를 보존하지만, .findAny() 메서드를 사용하면 먼저 발견한 요소를 반환하기 때문에 결과는 항상 불확실할 수 있습니다. 만약 두 개의 "AA" 값을 찾은 다음에 정확히 어떤 것이 반환될지 예측할 수 없다.
따라서 .findAny() 메서드를 사용하여 "AA"와 같은 중복된 요소를 찾는 것은 일반적으로 권장되지 않는다.대신 .filter()와 .collect()를 조합하여 원하는 조건에 맞는 모든 요소를 모아서 리스트 등의 컬렉션에 저장하는등 다음과 같이 처리할 수 있다.
@Override public List<Member> findAllByName(String name) { return store.values().stream() .filter(member -> member.getName().equals(name)) .collect(Collectors.toList()); }
이렇게 하면 "AA"와 같은 이름을 가진 모든 Member 객체들이 리스트로 반환된다.
728x90'Spring' 카테고리의 다른 글
[Spring] Objects.requireNonNull()의 사용법과 예시. (0) 2023.08.17 [정리본-비공개] Spring Boot EC2, RDS jar 배포방법 (0) 2023.07.02 @RequestParam과 @PathVariable 의 장단점 비교 (0) 2023.06.29 Spring Boot EC2, RDS 배포하기 (윈도우버전) (0) 2023.06.29