루핑
루핑(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);
}
}
'Back-end > 이것이 자바다[신용권 한빛미디어]' 카테고리의 다른 글
커스텀 집계(reduce()) (0) | 2022.06.25 |
---|---|
기본 집계(sum(), count(), average(), max(), min()) (0) | 2022.06.03 |
필터링(distinct(), filter()), 매핑(mapXXX), 정렬(sorted) (0) | 2022.05.30 |
스트림 파이프라인 (0) | 2022.05.28 |
스트림의 종류 (0) | 2022.05.28 |