///
Search
✍️

peek() 연산과 중간 결과 무시

태그
JAVA
Stream에서 peek() 연산의 경우 중간 연산자로서 스트림 요소를 확인하거나 디버깅 목적으로 사용된다. 이는 알고 있는 사실이다. 또한 일반적으로 peek() 연산은 단순 디버깅 용도 외에는 사용하면 안된다고 권장하고 있다.
아래의 코드와 같이 중간에 char[]를 확인하고, 마지막 Stream의 개수를 파악하기 위하여 count()를 실행하였다. 그런데 peek()연산들은 모두 무시되었다.
Stream.Builder<char[]> records = Stream.builder(); long count = records.build() .peek(chars -> System.out.println(chars.length)) .peek(chars -> System.out.println(new String(chars))) .count(); System.out.println(count);
Java
복사
최종적으로 알게 된 사실은 Stream의 요소를 반드시 소비할 필요가 없거나, 중간 연산이 최종 결과에 영향을 미치지 않는 경우에는 peek()연산이 무시된다는 것이다. 여기서 결과에 영향을 미치지 않는 케이스는 집계 연산을 들 수 있다.
편법으로 사용하는 방법은 다음과 같을 때 사용이 가능했다.
Stream.Builder<char[]> records = Stream.builder(); long count = records.build() .filter(chars -> true) // 중간 연산이 영향을 미칠 수 있음을 명시적으로 표현시켜버림 .peek(chars -> System.out.println(chars.length)) .peek(chars -> System.out.println(new String(chars))) .count(); System.out.println(count);
Java
복사