본문 바로가기
Java, Kotlin, Spring

[Java/Stream] anyMatch, allMatch, noneMatch

by 댕댕미냉 2024. 2. 21.

Stream API는 일부 조건에 따라 시퀀스 요소의 유효성을 검사할 수 있는 편리한 함수들을 제공하는데, anyMatch, allMatch, noneMatch가 그 역할을 한다. 3개의 함수들은 각각 Predicate을 파라미터로 받아 조건에 대한 일치 여부를 내려준다. 또한, 함수의 이름에서 알 수 있듯이, Matching 여부를 판단하지만 그에 따라 다른 결과를 반환하므로 상황에 맞는 함수를 사용해야 한다.

 

 

Predicate은 무엇인가?

Predicate은 함수형 인터페이스로, argument를 받아 boolean 값을 반환한다.
Predicate<T>에서 T는 predicate에 들어갈 input의 타입을 의미한다.

ex)
Predicate<Integer> predicate = (num) -> num < 10;

 

 

anyMatch

stream의 어떤 한 원소가 제공받은 predicate을 만족하는 지 여부를 반환한다.

  • predicate을 만족하는 원소가 존재하는 순간(조건이 true를 반환하는 순간) true를 리턴한다.
  • stream의 모든 원소를 돌면서 전부 다 조건을 만족하지 않는다면, false를 리턴한다.
  • 만약 stream이 비어있다면 false를 리턴한다.
        List<Integer> nums = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        boolean anyMatchNumberOver3 = nums.stream().anyMatch(n -> {
            System.out.print(n + " ");
            return n > 3;});
        System.out.println("\nAny match number over 3 = " + anyMatchNumberOver3);

        boolean anyMatchNumberOver10 = nums.stream().anyMatch(n -> {
            System.out.print(n + " ");
            return n > 10;});
        System.out.println("\nAny match number over 10 = " + anyMatchNumberOver10);
1 2 3 4
Any match number over 3 = true
1 2 3 4 5 6 7 8 9 10
Any match number over 10 = false

 

 

allMatch

stream의 모든 원소가 predicate을 만족하는 지 확인한다.

  • anyMatch와는 반대로, predicate을 만족하지 않는 원소가 존재하는 순간(조건이 false를 반환하는 순간) false를 리턴한다.
  • stream의 모든 원소를 돌며 모든 원소가 조건을 만족한다면 true를 리턴한다.
  • 만약 stream이 비어있다면 true를 리턴한다.
        List<Integer> nums = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        boolean allMatchNumberOver9 = nums.stream().allMatch(n -> {
            System.out.print(n + " ");
            return n > 9;});
        System.out.println("\nAll match number over 9 = " + allMatchNumberOver9);

        boolean allNumbersOver0 = nums.stream().allMatch(n -> {
            System.out.print(n + " ");
            return n > 0;});
        System.out.println("\nAll match number over 0 = " + allNumbersOver0);
1
All match number over 9 = false
1 2 3 4 5 6 7 8 9 10
All match number over 0 = true

 

 

noneMatch

stream의 모든 원소가 predicate을 만족하지 않는지 확인한다.

  • stream의 원소가 predicate을 만족하는 순간(조건이 true를 반환하는 순간) false를 리턴한다.
  • stream의 모든 원소를 돌면서 전부 다 조건을 만족하지 않는다면, true를 리턴한다.
  • 만약 stream이 비어있다면 true를 리턴한다.
  • 같은 조건을 넣었을 때 anyMatch와 반대값을 리턴한다.(동일 조건에서 anyMatch가 true라면 noneMatch는 false를, anyMatch가 false라면 noneMatch는 true를 리턴)
        List<Integer> nums = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        boolean noneMatchNumberOver7 = nums.stream().noneMatch(n -> {
            System.out.print(n + " ");
            return n > 7;});
        System.out.println("\nNone match number over 7 = " + noneMatchNumberOver7);

        boolean noneMatchNumberOver10 = nums.stream().noneMatch(n -> {
            System.out.print(n + " ");
            return n > 10;});
        System.out.println("\nNone match number over 10 = " + noneMatchNumberOver10);
1 2 3 4 5 6 7 8
None match number over 7 = false
1 2 3 4 5 6 7 8 9 10
None match number over 10 = true