2.(Stream)match 관련 코드 예시

이월(0216tw)·2024년 5월 16일

allMatch , anyMatch , noneMatch


allMatch()

주어진 조건(predicate)을 스트림의 모든 요소가 만족하는지 확인한다.
스트림이 비어있거나 모두 조건을 만족하면 true , 그렇지 않으면 false를 반환한다.
만약 false가 하나라도 발견되면 그 즉시 실행을 종료한다

allMatch 테스트 코드

@Test
public void allMatch_테스트() {
    int[] intArray = {1,2,3,4,5,6,7,8,9,10};

    boolean isAllLessThan11 = false;
    isAllLessThan11 = Arrays.stream(intArray).allMatch( number -> number < 11);
    System.out.println(isAllLessThan11); //true 반환
}

[코드 설명]

allMatch의 인자로 주어진 Predicate(조건)은 요소의 값이 11보다 작은지를 물어보고 있다. 1~10은 모두 11보다 작으므로 모두 true이기에 true를 반환한다.

allMatch 테스트 코드 (Predicate따로 뜯어서)


@Test
public void allMatch_테스트_Predicate_따로_빼내서() {
    int[] intArray = {1,2,3,4,5,6,7,8,9,10};

    //익명 클래스를 사용해서 바로 IntPredicate인터페이스 구현체 생성
    IntPredicate predicate = new IntPredicate() {
        @Override
        public boolean test(int value) {
            return value < 11;
        }
    };
    //혹은 다음과 같이 수행해도 됨
    //이거 자체가 위 test 메서드를 오버라이딩함을 축약한 것임    
    Predicate<Integer> predicate2 = integer -> integer < 11; 

	boolean isAllLessThan11 = false;
    isAllLessThan11 = Arrays.stream(intArray).allMatch(predicate);
    System.out.println(isAllLessThan11); //true 반환
}

[코드 설명]

만약 조건이 너무 길다면 코드의 복잡성을 고려하여 Predicate 인터페이스를 따로 구현하고 인자가 allMatch에 주어도 될 것 같다. 원래는 람다식으로 편하게 integer -> integer < 11; 로 사용을 했고, 이걸 풀어써보면 사실상 Predicate 인터페이스의 test(integer) 메서드를 오버라이딩 한 결과과 동일하다.

allMatch 테스트 코드 (false 케이스)

@Test
public void allMatch_테스트() {
    int[] intArray = {1,2,300,4,5,6,7,8,9,10}; //300은 11보다 크다. 

    boolean isAllLessThan11 = true;
    isAllLessThan11 = Arrays.stream(intArray).allMatch( number -> number < 11);
    System.out.println(isAllLessThan11); // false 반환
}

위처럼 하나라도 조건에 맞지 않는 대상이 있다면 false를 반환함과 동시에
**해당 스트림을 종료한다. (더 이상 4,5,6.. 등을 비교하지 않음)


noneMatch()

조건에 맞는 대상이 하나도 없거나 스트림이 비어있으면 true를 반환한다.

noneMatch 테스트 코드

noneMatch는 allMatch와 반대로 조건에 맞는게 아무것도 존재하지 않거나 스트림이 비어있으면 true이다. 요소 하나라도 조건에 부합한게 있다면 false를 반환한다.

@Test
public void noneMatch_테스트() {
    int[] intArray = {1,2,3,4,5,6,7,8,9,10};

    boolean isAllLessThan11 = true;
    isAllLessThan11 = Arrays.stream(intArray).noneMatch( number -> number < 11);
    System.out.println(isAllLessThan11); // false 반환
}

위의 경우 요소가 11보다 작은 것을 찾아보는데, 1에서부터 이미 조건에 부합하는게 있어버린다. 그래서 false 반환 후 더이상 실행되지 않는다.

@Test
public void noneMatch_테스트() {

    int[] intArray = {1,2,3,4,5,6,7,8,9,10};

    boolean isAllLessThan11 = false;
    isAllLessThan11 = Arrays.stream(intArray).noneMatch( number -> number > 11);
    System.out.println(isAllLessThan11); // true 반환
}

이 경우 모든 요소가 11보다 큰지 조건을 주고 있다.
1~10은 모두 11보다 작기때문에 조건에 맞지 않고, 따라서 noneMatch 요구사항에 부합하므로 true가 반환된다.


anyMatch()

주어진 조건에 하나라도 맞는 요소가 있다면 true를반환한다.
만약 스트림이 비어있다면 all,none과 달리 false를 반환한다.

@Test
public void anyMatch_테스트() {

    int[] intArray = {100,200,300,400,5,600,700,800,900,1000};

    boolean isAllLessThan11 = false;
    isAllLessThan11 = Arrays.stream(intArray).anyMatch( number -> number< 11);
    System.out.println(isAllLessThan11); // true 반환
}

요소가 11보다 작은지를 물어보는 조건에 맞는 대상이 5 하나 존재하기에
하나라도 맞는 조건이 있으니 true를 리턴한다.
(만약 500으로 바꾸면 조건에 맞는게 하나도 없으니 false를 리턴)

@Test
public void anyMatch_테스트() {

   int[] intArray = {}; //비어있음

    boolean isAllLessThan11 = false;
    isAllLessThan11 = Arrays.stream(intArray).anyMatch( number -> number< 11);
    System.out.println(isAllLessThan11); // false 반환
}

요소가 하나도 없으면 anyMatch는 false를 반환한다.

profile
#SQLD강사 #AI개발 #AI강사 #개발자 개발도 하고 강의도 하지만 고민을 제일 많이 합니다

0개의 댓글