루핑(looping)
은 스트림에서 요소를 하나씩 가져와서 처리하는 기능입니다.
루핑
이라는 단어는 지금 처음 등장했는데 사실은 아주 익숙한 메소드입니다. 왜냐하면 지금까지 스트림의 기초부터 기능까지 소개하면서 계속 나온 forEach()
가 바로 루핑 메소드이기 때문입니다.
루핑
메소드는 peek()
와 forEach()
가 있는데요. 기능은 동일하지만 peek()
는 중간 처리 메소드이고, forEach()
는 최종 처리 메소드입니다. 따라서 peek()
를 사용할 때는 최종 처리 메소드를 붙여줘야한다는 것을 반드시 기억해주세요.
메소드 | 설명 |
---|---|
peek(Consumer) | 전달된 요소를 반복 처리 최종 처리가 아니므로 스트림을 반환 |
forEach(Consumer) | 전달된 요소를 반복 처리 최종 처리이므로 반환값 타입은 void |
Consumer
는 함수형 인터페이스로 accept()
라는 추상 메소드를 가지고 있습니다. accept()
는 매개변수로 받은 값을 처리하는 메소드입니다. 이를 람다식으로 표현하면 다음과 같습니다.
T -> {
//실행 코드
}
forEach()
는 많이 썼으니 peek()
를 이용해서 중간 처리하는 예제 코드를 하나 만들었습니다.
public class Main {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
IntStream stream = Arrays.stream(arr);
int sum = stream.map(elem -> elem *= 10)
.peek(elem -> System.out.println(elem))
.sum();
System.out.println("요소 총합: " + sum);
}
}
map()
으로 요소에 10을 곱해줍니다. 그리고 곱해진 요소를 확인하기 위해 peek()
로 하나씩 출력합니다. 마지막으로 최종 처리 메소드인 sum()
으로 총합을 구하는 코드입니다.