Back-end/이것이 자바다[신용권 한빛미디어]

루핑(peek(), forEach()), 매칭 (allMatch(), anyMatch(), noneMatch())

Ho's log 2022. 6. 2. 15:35

루핑


루핑(looping)은 요소 전체를 반복하는 것을 말한다. 

루핑하는 메소드에는 peek(), forEach() 가 있다

 

이 두 메소드는 루핑한다는 기능에서는 동일하지만, 동작 방식은 다르다.

peek()는 중간 처리 메소드이고, forEach()는 최종 처리 메소드이다.

 

peek() 는 중간 처리 단계에서 전체 요소를 루핑하면서 추가적인 작업을 하기 위해 사용한다.

최종 처리 메소드가 실행 되지 않으면 지연되기 때문에, 반드시 최종 처리 메소드가 호출 되어야 동작한다.

 

예를 들어 필터링 후 어떤 요소만 남았는지 확인하기 위해 다음과 같이 peek() 를 마지막에 호출할 경우 스트림은 전혀 동작하지 않는다

요소 처리의 최종 단계가 합을 구하는 것이라면, peek() 메소드 호출 후 sum() 을 호출해야만 peek()가 정상적으로 동작 한다

intStream.filter(a-> a%2 == 0).peek(a-> System.out.println(a)) 동작 X

intStream.filter(a-> a%2 ==0).peek(a-> System.out.println(a)).sum()

 

하지만 forEach()는 최종 처리 메소드 이기 때문에 파이프 라인 마지막에 루핑하면서 요소를 하나씩 처리한다.

forEach()는 요소를 소비하는 최종 처리 메소드이므로 이후에 Sum()과 같은 다른 최종 메소드를 호출하면 안된다 

package Stream;

import java.util.Arrays;

public class LoopingExample {
    public static void main(String[] args) {
        int[] intArray = {1,2,3,4,5};

        System.out.println("peek를 마지막에 호출한 경우");
        Arrays.stream(intArray).filter(a->a%2 ==0).peek(System.out::println);// 동작 X

        System.out.println("최종 처리 메서드는 마지막에 호출한 경우");
        int total = Arrays.stream(intArray).filter(a->a%2 ==0).peek(System.out::println).sum();
        System.out.println("total : " + total);

        System.out.println("==================================================");
        System.out.println("forEach를 마지막에 호출한 경우");

        Arrays.stream(intArray).filter(a->a%2 ==0).forEach(System.out::println); // 최종처리 메서드로 동작 
    }
}

 

매칭(allMatch(), anyMatch(), noneMatch())


스트림 클래스는 최종 처리 단계에서 요소들이 특정 조건에 만족하는지 조사할 수 있도록 세가지 매칭 메소드를 제공

 

allMatch() 메소드는 모든 요소들이 매개값으로 주어진 Predicate의 조건을 만족하는지 조사

anyMatch() 메소드는 최소한 한 개의 요소가 매개값으로 주어진 Predicata 조건을 만족하는지 조사

noneMatch()는 모든 요소들이 매개값으로 주어진 Predicate의 조건을 만족하지 않는지 조사한다.

리턴 타입 메소드(매개 변수) 제공 인터페이스
boolean allMatch(Predicate<T> predicate)
anyMatch(Predicate<T> predicate)
noneMatch(Predicate<T> predicate) 
Steram
boolean allMatch(IntPredicate predicate)
anyMatch(IntPredicate predicate)
noneMatch(IntPredicate predicate) 
IntStream
boolean allMatch(LongPredicate predicate)
anyMatch(LongPredicate predicate)
noneMatch(LongPredicate predicate) 
LongStream
boolean allMatch(DoublePredicate predicate)
anyMatch(DoublePredicate predicate)
noneMatch(DoublePredicate predicate) 
DoubleStream
package Stream;

import java.util.Arrays;

public class MatchExample {
    public static void main(String[] args) {
        int[] intArray = {2,4,6,8,10};
        
        boolean result = Arrays.stream(intArray).allMatch(predicate -> predicate % 2 == 0);
        System.out.println("is 2,4,6,8,10 all even? : " + result);

        result = Arrays.stream(intArray).anyMatch(predicate -> predicate % 2 == 0);
        System.out.println("is 2,4,6,8,10 any even? : " + result);

        result = Arrays.stream(intArray).noneMatch(predicate -> predicate % 7 == 0);
        System.out.println("is 2,4,6,8,10 none 7? : " + result);
    }
}