Search
moon
sun
✍️

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
복사