안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^ |
요소 전체를 반복하는 것을 루핑이라고 합니다.
메소드로는 peek() 와 forEach()가 있는데
위 두 메소드는 기능은 같지만 동작 방식이 다릅니다.
peek() 는 중간 처리 단계에서 전체 요소를 루핑하고, 추가적 작업을 위해 사용하며,
최종 처리 메소드가 호출돼야만 동작합니다.
예) 필터링 후에 어떤 요소가 남았는지 확인할 때 사용 때
intStream
.filter( a -> a % 3 ==0 )
.peek(a -> System.out.println( a) )
.sum();
peek() 메소드가 가장 마지막에 호출된다면 해당 스트림은 동작하지 않습니다.
forEach() 는 최종 처리 메소드로써 파이프 라인 마지막에 루핑하며 요소를 하나씩 처리합니다.
최종 처리 메소드이므로 forEach() 뒤에 sum() 같은 최종 처리 메소드가 호출되면 안됩니다.
예제)
import java.util.Arrays;
public class Example {
public static void main(String[] args) {
int[] intArr = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
System.out.println("peek()를 마지막에 호출");
Arrays.stream(intArr)
.filter(a -> a%2==0)
.peek(n -> System.out.println(n)); //동작 하지 않음.
System.out.println("최종 처리 메소드를 마지막에 호출");
int total = Arrays.stream(intArr)
.filter(a -> a%2==0)
.peek(n -> System.out.println(n)) //동작
.sum();
System.out.println("총합: " + total);
System.out.println("forEach()를 마지막에 호출");
Arrays.stream(intArr)
.filter(a -> a%2==0)
.forEach(n -> System.out.println(n)); //동작
}
}
매칭
스트림 클래스에 최종 처리 단계에서 요소들이 특정한 조건을 만족하는지를
조사할 수 있도록 제공한 메소드를 매칭 메소드라고 합니다.
allMatch()
=> 모든 요소들이 매개값으로 주어진 Predicate의 조건을 만족하는지 검사합니다.
anyMatch()
=> 최소 한 개의 요소가 매개값으로 주어진 Predicate의 조건을 만족하는지 조사합니다.
noneMatch()
=> 모든 요소들이 매개값으로 주어진 Predicate의 조건을 만족하지 않는지 검사합니다.
위 세 메소드의 리턴타입은 전부 boolean입니다
제공 인터페이스는 Stream, IntStream, LongStream, DoubleStream 네 가지가 있고
매개 변수로는 Predicate<T>, IntPredicate, LongPredicate, DoublePredicate가 올 수 있습니다.
예제)
import java.util.Arrays;
public class Example {
public static void main(String[] args) {
int[] intArr = { 24, 48 ,60, 80, 100 };
boolean result = Arrays.stream(intArr)
.allMatch(a -> a%2==0);
System.out.println("모두 2의 배수입니까? " + result);
result = Arrays.stream(intArr)
.anyMatch(a -> a%3==0);
System.out.println("하나라도 3의 배수가 있습니까? " + result);
result = Arrays.stream(intArr)
.noneMatch(a -> a%3==0);
System.out.println("3의 배수가 없습니까? " + result);
}
}
이상입니다.