내가 스트림을 가지고 있고 스트림 중간에 "풍부하게"하고 싶다고 가정 해 보겠습니다 peek()
. 예를 들면 다음과 같습니다.
streamOfThings.peek(this::thingMutator).forEach(this::someConsumer);
코드에서이 시점에서 Things를 변경하는 것이 올바른 동작이라고 가정합니다. 예를 들어, thingMutator
메소드는 "lastProcessed"필드를 현재 시간으로 설정할 수 있습니다.
그러나 peek()
대부분의 상황에서 "보이지만 만지지 마십시오"를 의미합니다.
스트림 요소 peek()
를 음소거 하는 데 사용 하는 것이 반 패턴이거나 잘못 권장됩니까?
편집하다:
보다 전통적인 대안은 소비자를 전환하는 것입니다.
private void thingMutator(Thing thing) {
thing.setLastProcessed(System.currentTimeMillis());
}
매개 변수를 반환하는 함수로
private Thing thingMutator(Thing thing) {
thing.setLastProcessed(currentTimeMillis());
return thing;
}
사용이 map()
대신 :
stream.map(this::thingMutator)...
그러나 그것은 perfunctory 코드 ( return
) 를 소개 peek()
하며 동일한 객체를 반환한다는 것을 알고 있기 때문에 더 명확하다고 확신 하지는 않지만 map()
동일한 클래스 의 객체 라는 것을 한눈에 알 수는 없습니다 .
또한, peek()
당신은 돌연변이 람다를 가질 수 있지만 map()
, 기차 난파선을 만들어야합니다. 비교:
stream.peek(t -> t.setLastProcessed(currentTimeMillis())).forEach(...)
stream.map(t -> {t.setLastProcessed(currentTimeMillis()); return t;}).forEach(...)
나는 peek()
버전이 더 깨끗하고 람다는 분명히 변하고 있다고 생각 하므로 "신비한"부작용은 없다. 유사하게, 방법 참조가 사용되고 방법의 이름이 돌연변이를 분명히 암시한다면, 그것도 분명하고 명백하다.
개인적으로, 나는 peek()
돌연변이 를 사용하여 부끄러워하지 않습니다 . 매우 편리합니다.
peek
요소를 동적으로 생성하는 스트림과 함께 사용 했습니까 ? 여전히 작동합니까, 아니면 변경 사항이 손실됩니까? 스트림 요소를 수정하면 신뢰할 수없는 소리가납니다.
List<Thing> list; things.stream().peek(list::add).forEach(...);
매우 편리합니다. 최근. 게시 정보를 추가하는 데 사용했습니다 : Map<Thing, Long> timestamps = ...; return things.stream().peek(t -> t.setTimestamp(timestamp.get(t))).collect(toList());
. 이 예제를 수행하는 다른 방법이 있다는 것을 알고 있지만 여기서는 지나치게 단순화하고 있습니다. 를 사용 peek()
하면 더 작고 더 우아한 코드 IMHO가 생성됩니다. 가독성을 제외하고,이 질문은 실제로 당신이 제기 한 것에 관한 것입니다. 안전 / 신뢰할 수 있습니까?
peek
있습니까? 나는 stackoverflow에 대해 비슷한 질문을 가지고 있으며 그것을보고 피드백을 줄 수 있기를 바랍니다. 감사. stackoverflow.com/questions/47356992/…