Stream.peek 작업을 사용하고있는 다른 Stackoverflow question 나왔다 솔루션을 작동하지만 여전히 상태를 변경하기 때문에 오른쪽 같지 않습니다. Stream.peek
방법.Stream.peek 상태 변경 가능한 부작용 및이 같은 사용하지 왜
내가 여전히 Stream.peek
합니다 (Stream
의 소스 모음의 상태를 포함) 상태를 변이 안된다는 완전히 확신하지 않다 상태를 돌연변이 확인 여부 Stream.peek
사용에 (here 및 here)를 연구하는 동안.
이 방법은 당신이 그들이 파이프 라인에서 특정 지점을지나 흐름으로 요소를보고 싶은 경우 주로 디버깅을 지원하기 위해 존재 : 여기
는 Javadoc의 말씀입니다
그런 다음 :
매개 변수 : 작업 - a 간섭 없음 요소가 스트림에서 소비 될 때 요소에서 수행 할 작업입니다.
잘 동작하는 비 간섭 스트림 소스에, 소스는 동작이 개시 단말 전에 변형 될 수 있으며, 이러한 변형이 반영된다 elements.All에게 JDK 모음에서 반환 스트림을 다루는 , 그리고 대부분 JDK 클래스는 이러한 방식으로 올바르게 동작합니다. 스트림의 컬렉션의 상태를 변경하지 포함 동작을 비 간섭처럼
보인다.
다음은 Stream.peek
을 사용하는 코드입니다.
Map< String, List<Test> > userTests = new HashMap<>();
Map< String, List<Test> > filtered = userTests.entrySet().stream()
.peek(e -> e.setValue(modifyListAndReturnIt(e.getValue())))
.filter(e -> !e.getValue().isEmpty()) //check if modified list in peek has been emptied
.collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
public static List<Test> modifyListAndReturnIt(List<Test> list){
if (somecondition) list.clear();
return list;
}
1) 위 코드에 부작용이 있습니까?
2) 그런 방식으로 peek을 사용하지 않는 이유는 무엇입니까? Javadoc은 그것을 허용하지 않는 것 같습니다.
당신은 완전성에 대한 스트림 소스와 방법의 정의의 정의 스트림 파이프 라인 내에서 사용되는 표시 할 수 있습니다? 또한, 두 번째 질문에 대해서만 당신은 자기 자신에게 물어볼 필요가있다. "왜 그 방법이 디버깅 목적을위한 것인지는?" 그런 다음 "peek"메소드의 구현이 변경되면 자문 해보십시오. 내 코드는 어떻게됩니까? –
내 조언은 당신이 항상하는 방법을이 사용하기위한 한 방법을 사용해야한다는 것입니다. 아무것도 더. –
@ Aominè. 사실 Javadoc은 "오직"디버깅에 사용되어야한다고 말하지 않고 "대부분"은 "유일한 것"과 같지 않습니다. – tsolakp