JAVA

Java Stream anyMatch(), allMatch(), noneMatch() 완벽 정리

곽코딩루카 2025. 3. 17. 10:57
반응형

 

안녕하세요!


이번 포스팅에서는 Java 8 Stream API에서 제공하는 anyMatch(), allMatch(), noneMatch() 메서드에 대해 자세히 알아보겠습니다.

이 메서드들은 리스트(List), 집합(Set) 등의 컬렉션에서 특정 조건을 만족하는 요소가 있는지 확인하는 데 유용하게 사용됩니다.
하지만 동작 방식이 비슷해서 헷갈리기 쉬운데요. 이번 글을 통해 공통점과 차이점, 그리고 실행 과정을 완벽하게 이해해 봅시다! 

 

 

1. anyMatch(), allMatch(), noneMatch() 개념 정리

1) anyMatch()

리스트에서 하나라도 조건을 만족하면 true 반환 (즉시 종료)

anyMatch()는 스트림 내 요소 중 하나라도 주어진 조건을 만족하면 true를 반환하고, 즉시 실행을 종료합니다.
즉, 조건을 만족하는 요소가 하나라도 발견되면 더 이상 반복하지 않고 빠르게 반환하는 것이 특징입니다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

boolean hasEven = numbers.stream().anyMatch(n -> n % 2 == 0); // 짝수가 하나라도 있는가?
System.out.println(hasEven); // true (2, 4가 존재)

 

 2를 발견하는 순간 true를 반환하고, 나머지 요소(3, 4, 5)는 검사하지 않습니다.

 

 

 

 2) allMatch()

리스트의 모든 요소가 조건을 만족하면 true 반환 (하나라도 만족하지 않으면 false)

allMatch()는 스트림의 모든 요소가 주어진 조건을 만족해야 true를 반환합니다.
만약 단 하나라도 조건을 만족하지 않는 요소가 있으면, 즉시 false를 반환하고 실행을 종료합니다.

List<Integer> numbers = Arrays.asList(2, 4, 6, 8, 10);

boolean allEven = numbers.stream().allMatch(n -> n % 2 == 0); // 모든 요소가 짝수인가?
System.out.println(allEven); // true (모든 숫자가 짝수)

 

✔️ 모든 숫자가 짝수이므로 true 반환

 

 

 

 

List<Integer> numbers = Arrays.asList(2, 4, 6, 7, 8, 10);

boolean allEven = numbers.stream().allMatch(n -> n % 2 == 0);
System.out.println(allEven); // false (7 때문에 즉시 종료)
 

✔️ 7이 홀수이므로, false 반환 후 즉시 종료

 

 

 

 

3) noneMatch()

리스트의 모든 요소가 조건을 만족하지 않으면 true 반환 (하나라도 만족하면 false)

noneMatch()는 모든 요소가 주어진 조건을 만족하지 않을 경우 true를 반환합니다.
만약 조건을 만족하는 요소가 하나라도 발견되면 즉시 false를 반환합니다.

List<Integer> numbers = Arrays.asList(1, 3, 5, 7, 9);

boolean noEven = numbers.stream().noneMatch(n -> n % 2 == 0); // 짝수가 하나도 없는가?
System.out.println(noEven); // true (모두 홀수)
 

✔️ 리스트에 짝수가 없으므로 true 반환

 

 

 

 

List<Integer> numbers = Arrays.asList(1, 3, 4, 5, 7);

boolean noEven = numbers.stream().noneMatch(n -> n % 2 == 0);
System.out.println(noEven); // false (4 때문에 즉시 종료)

✔️ 4가 발견되자마자 false 반환 후 종료

 

 

 

 2. anyMatch(), allMatch(), noneMatch() 공통점

공통점 1: 단락(short-circuit) 종료

이 세 가지 메서드는 조건을 만족하는 경우 더 이상 실행되지 않고 즉시 종료되는 "단락 종료 연산"(Short-Circuiting Operation)입니다.
즉, 불필요한 연산을 방지하여 성능 최적화가 가능합니다.


anyMatch() 조건을 만족하는 요소가 하나라도 있을 때  즉시 종료
allMatch() 조건을 만족하지 않는 요소가 하나라도 있을 때  즉시 종료
noneMatch() 조건을 만족하는 요소가 하나라도 있을 때  즉시 종료

 

 

공통점 2: Predicate<T> 인터페이스 사용

이 세 메서드는 모두 Predicate<T> 인터페이스를 매개변수로 받습니다.
Predicate<T>는 입력값을 받아 true 또는 false를 반환하는 함수형 인터페이스입니다.

Predicate<Integer> isEven = n -> n % 2 == 0;
boolean hasEven = numbers.stream().anyMatch(isEven);

 

 

 

 

 

3. anyMatch(), allMatch(), noneMatch() 차이점

anyMatch() true 하나라도 조건을 만족하면 true 반환
allMatch() true 모든 요소가 조건을 만족해야 true 반환 (하나라도 불만족하면 false)
noneMatch() true 모든 요소가 조건을 만족하지 않으면 true 반환 (하나라도 만족하면 false)

 

 

4. 스트림이 비어 있을 경우 반환값

세 메서드는 스트림이 비어 있으면 다르게 동작합니다.

List<Integer> emptyList = new ArrayList<>();

boolean isAnyMatch = emptyList.stream().anyMatch(n -> n == 2);
boolean isAllMatch = emptyList.stream().allMatch(n -> n == 2);
boolean isNoneMatch = emptyList.stream().noneMatch(n -> n == 2);

System.out.println("anyMatch(): " + isAnyMatch); // false
System.out.println("allMatch(): " + isAllMatch); // true
System.out.println("noneMatch(): " + isNoneMatch); // true
 

✔️ anyMatch() → 요소가 없으므로 false
✔️ allMatch() → "Vacuous Truth" 개념에 따라 true
✔️ noneMatch() → anyMatch()의 반대 결과이므로 true

 

 5. noneMatch()는 anyMatch() 또는 allMatch()의 반대일까?

noneMatch()는 anyMatch()의 반대일까, 아니면 allMatch()의 반대일까?

✔️ noneMatch()는 anyMatch()와 논리적으로 반대 관계를 가짐
✔️ noneMatch()는 allMatch()와 반대가 아님
✔️ 빈 스트림일 때 allMatch()와 noneMatch()가 같은 결과(true)를 반환하므로 반대라고 볼 수 없음

반응형