Java Stream peek 기능
Java stream peek은 stream을 사용할 때 디버깅을 할 때 유용하게 사용할 수 있는 기능이다.
하지만 peek은 중간 연산에서는 동작하지 않고 최종 연산이 있는 경우에만 동작한다.
아래 예를 보자.
public void peekNoWorkingTest() {
List<String> numbers = Arrays.asList("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten");
numbers.stream()
.filter(s -> s.length() > 3)
.peek(System.out::println); // print nothing
}
위의 예에서 아무것도 출력되지 않는다.
하지만 아래와 같이 최종 연산으로 collect를 하면 결과가 출력된다.
public void peekTest() {
List<String> numbers = Arrays.asList("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten");
numbers.stream()
.filter(s -> s.length() > 3)
.peek(System.out::println)
.collect(Collectors.toList());
}
// 출력
three
four
five
seven
eight
nine
javadoc 문서에 따르면 peek은 파이프라인의 특정 시점의 요소를 확인하고 싶은 경우와 같이 디버깅을 지원하기 위해 존재한다고 한다.
사용법은 아래와 같다.
public void peekDebuggingTest() {
List<String> numbers = Arrays.asList("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten");
numbers.stream()
.filter(s -> s.length() > 3)
.peek(e -> System.out.println("filter value: " + e))
.map(String::toUpperCase)
.peek(e -> System.out.println("map value: " + e))
.collect(Collectors.toList());
}
// 출력
filter value: three
map value: THREE
filter value: four
map value: FOUR
filter value: five
map value: FIVE
filter value: seven
map value: SEVEN
filter value: eight
map value: EIGHT
filter value: nine
map value: NINE
반응형