다음과 같은 코드 조각이 있습니다.Java 스트림이 sideeffect로 매핑되고 결과 목록을 수집하거나 foreach하고 채 웁니다.
나는 이와 관련하여 두 가지 모순되는 (?) "규칙"을 읽었습니다.
.map
부작용이없는 것이- 그
.foreach
해야하지 갱신 변경 가능한 변수 (I foreach는 사용하고 를 결과 목록을 채우는 리팩토링 경우 그래서, 그 고장이) http://files.zeroturnaround.com/pdf/zt_java8_streams_cheat_sheet.pdf 에서 언급 한 바와 같이
스트림을 사용하고 목록을 반환하기 위해 어떻게 해결할 수 있습니까? 아니면 단순히 스트림을 건너 뛸까요?
@Transactional
public Collection<Thing> save(Collection<Thing> things) {
return things.stream().map(this::save).collect(Collectors.toList());
}
@Transactional
public Thing save(Thing thing) {
// org.springframework.data.repository.CrudRepository.save
// Saves a given entity. Use the returned instance for further operations as the save operation might have changed the entity instance completely.
Thing saved = thingRepo.save(thing);
return saved;
}
.foreach와 관련된 규칙의 정확한 출처를 알려주시겠습니까? 그것이 작업하고있는 객체의 변수 또는 어떤 종류의 변수입니까? (그것은 '변경 가능 변수 업데이트'라고 말하는 것이 이상합니다. '불변 변수 업데이트'란 무엇입니까?) 어쨌든 여기서는 for 루프를 사용하고 명시 적 컬렉션 관리를 사용하면 스트림이 실제로 작업을 저장하지 않을 것이라고 제안하거나 여기에 더 많은 명확성을 제공합니다. –
요점은 * 간섭 *을 피해야한다는 것입니다. 동일한 'Thing'인스턴스가 소스 컬렉션에 두 번 이상 나타나면 실행할 수 있지만 응용 프로그램 논리로 인해이를 배제 할 수 있다고 가정합니다. 그러면'thingRepo.save (...)'가'thingRepo'의 상태를 어떻게 변경시킬 수 있는지에 달려 있습니다. 일반적으로'forEach'를 통해리스트를 생성하기 전에 스트림을 사용하지 않는 편이 좋을 것입니다. 왜냐하면 후자는'for' 루프보다 간단하고 깨끗한 코드를 생성하지 않기 때문입니다. – Holger