Java/스트림(Stream)

[Java]Stream 모든 요소가 조건을 만족하는지 확인 - allMatch 메서드

DevStory 2022. 8. 25.

allMatch 메서드

Stream 클래스에서 제공하는 allMatch() 메서드는 조건식에 따라 Boolean 타입의 값을 반환합니다.

boolean allMatch(Predicate<? super T> predicate);

allMatch 메서드 특징

  • 단락 종료 오퍼레이션(short-circulting terminal operation)입니다. false를 반환하는 경우 더 이상 allMatch() 메서드를 호출하지 않습니다.
  • 매개변수는 함수형 인터페이스인 Predicate 타입입니다. Predicate 인터페이스는 한 개의 매개변수를 가지며, Boolean 타입의 값을 반환하는 작업을 수행하기 위해 사용됩니다.
  • 스트림이 비어 있는 경우 true를 반환합니다.
※ 공허한 진실(Vacuous Truth)
스트림이 비어 있는 경우 anyMatch() 메서드는 false를 반환하지만, allMatch() 메서드는 true를 반환합니다. true를 반환하는 이유는 수학과 논리학에서 사용되는 공허한 진실(Vacuous Truth)이라는 개념이 적용되기 때문입니다.

예를 들어, "약을 먹으면 감기가 낫는다"라는 명제에서 "약을 먹으면"은 가정이고 "감기가 낫는다"는 결론입니다. '감기가 낫는다'라는 결론이 참이 되기 위해서는 '약을 먹어야'합니다.

여기서 가정이 거짓인 경우 "약을 먹지 않으면 감기가 낫는다"라는 명제도 참이 될 수 있습니다. 즉, 감기를 낫기 위해 꼭 약을 먹어야 할 필요가 없다는 것이죠. 약을 먹든 안 먹든 감기는 나을 수 있습니다.

위 예시처럼 가정이 참이든 거짓이든 상관없이 결론이 참인 경우 공허한 진실(Vacuous Trute)이라고 말합니다. 이 개념이 allMatch() 메서드에 적용되어 값이 있든 없든 true를 반환합니다.

예제 1. Integer 타입의 List

다음 예제는 Integer 타입의 List에서 모든 요소가 0 ~ 100 사이의 값인지 Stream 클래스의 allMatch() 메서드로 확인합니다.

public static void main(String args[]) {
  List<Integer> intList1 = new ArrayList<>(Arrays.asList(20, 40, 60, 80));
  List<Integer> intList2 = new ArrayList<>(Arrays.asList(20, 400, 60, 800));

  Boolean isBool1 =
          intList1.stream().allMatch(num -> num >= 0 && num <= 100);

  Boolean isBool2 =
          intList2.stream().allMatch(num -> num >= 0 && num <= 100);

  System.out.println("intList1의 모든 요소는 0 ~ 100 사이인가? " + isBool1);
  System.out.println("intList2의 모든 요소는 0 ~ 100 사이인가? " + isBool2);
}

[실행 결과]

intList1의 모든 요소는 0 ~ 100 사이인가? true
intList2의 모든 요소는 0 ~ 100 사이인가? false

예제 2. allMatch 메서드 동작 확인

다음 예제는 첫 번째 예제와 동일하지만, allMatch() 메서드의 동작 과정을 확인하기 위해 콘솔에 값을 출력하는 소스 코드를 추가합니다.

public static void main(String args[]) {
  List<Integer> intList = new ArrayList<>(Arrays.asList(20, 40, 600, 80));

  Boolean isBool =
          intList.stream().allMatch(num -> {
              System.out.println("현재 요소는? " + num);
              return num >= 0 && num <= 100;
          });

  System.out.println("intList의 모든 요소는 0 ~ 100 사이인가? " + isBool);
}

[실행 결과]

현재 요소는? 20
현재 요소는? 40
현재 요소는? 600
intList의 모든 요소는 0 ~ 100 사이인가? false

조건을 만족하지 않는 요소가 단 하나라도 존재하는 경우 allMatch() 메서드는 false를 반환하고 더 이상 실행되지 않는 것을 확인할 수 있습니다.


예제 3. 스트림이 비어 있는 경우

다음 예제는 스트림이 비어 있는 경우 allMatch() 메서드의 반환 결과와 anyMatch() 메서드의 반환 결과를 콘솔에 출력합니다.

public static void main(String args[]) {
  List<Integer> intList = new ArrayList<>();

  Boolean isAllMatchReturn =
          intList.stream().allMatch(num -> num >= 0 && num <= 100);

  Boolean isAnyMatchReturn =
          intList.stream().anyMatch(num -> num >= 0 && num <= 100);

  System.out.println("스트림이 비어 있는 경우 allMatch()의 반환 결과: " + isAllMatchReturn);
  System.out.println("스트림이 비어 있는 경우 anyMatch()의 반환 결과: " + isAnyMatchReturn);
}

[실행 결과]

스트림이 비어 있는 경우 allMatch()의 반환 결과: true
스트림이 비어 있는 경우 anyMatch()의 반환 결과: false
반응형

댓글