토론을 위해 예제를 다시 형식화하겠습니다.
long runCount = 0L;
myStream.stream()
.filter(...)
.forEach(item -> {
foo();
bar();
runCount++;
});
System.out.println("The lambda ran " + runCount + " times");
실제로 람다 내에서 카운터를 증분해야하는 경우 일반적인 방법은 카운터를 AtomicInteger
또는 AtomicLong
로 만든 다음 증분 메서드 중 하나를 호출하는 것입니다.
단일 요소 int
또는 long
배열을 사용할 수 있지만 스트림이 병렬로 실행되는 경우 경쟁 조건이 있습니다.
그러나 스트림이으로 끝나는 forEach
것은 반환 값이 없음을 의미합니다. 당신은 변경할 수 forEach
A를 peek
통해 항목을 통과하는, 다음을 수 :
long runCount = myStream.stream()
.filter(...)
.peek(item -> {
foo();
bar();
})
.count();
System.out.println("The lambda ran " + runCount + " times");
이것은 다소 더 좋지만 여전히 약간 이상합니다. 그 이유는 것입니다 forEach
및 peek
유일한 부작용을 통해 자신의 작업을 할 수 있습니다. Java 8의 새로운 기능 스타일은 부작용을 방지하는 것입니다. 카운터의 증분을 count
스트림에 대한 작업으로 추출하여 약간의 작업을 수행했습니다. 다른 일반적인 부작용은 컬렉션에 항목을 추가하는 것입니다. 일반적으로 수집기를 사용하여 교체 할 수 있습니다. 그러나 당신이하려는 실제 작업이 무엇인지 모르면 더 구체적인 것을 제안 할 수 없습니다.