2017-05-28 7 views
4

Unten ist mein Code:Java 8 Strom wurde bereits operiert oder geschlossen

void deleteTranslationIfUpdated(Stream<MediaTranslation> from, Stream<MediaTranslationDTO> data) { 
    Stream<MediaTranslation> newLogos = data 
     .map(mediaTranslationMapper::mapToEntity) 
     .collect(Collectors.toList()) 
     .stream(); 

    from.filter(e -> 
     newLogos.noneMatch(it -> 
      Objects.equals(e.getLang(), it.getLang()) && Objects.equals(e.getValue().getLink(), it.getValue().getLink()))) 
     .map(MediaTranslation::getValue) 
     .map(Media::getLink) 
     .filter(this::isNotHttpLink) 
     .forEach(storageService::delete); 
} 

Above Funktion aus der unten Funktion aufgerufen wird:

@Secured({AuthoritiesConstants.USER}) 
public BrandDTO update(String id, BrandDTO data) throws EntityNotFound { 
    log.debug("Request to update Brand : {} with {}", id, data); 
    return Optional.ofNullable(brandRepository.findOne(id)) 
     .map(from -> { 
      mediaService.deleteTranslationIfUpdated(from.getLogo().stream(), data.getLogo().stream()); 
      return from; 
     }) 
     .map(target -> brandMapper.updateFromDto(data, target)) 
     .map(brandRepository::save) 
     .map(brandMapper::mapToDto) 
     .map(this::copyCategoriesInZone) 
     .orElseThrow(EntityNotFound::new); 
} 

Und wenn ich so tun, erhalte ich die unter Fehler:

java.lang.IllegalStateException: stream has already been operated upon or closed at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229) at java.util.stream.ReferencePipeline.noneMatch(ReferencePipeline.java:459) at com.nearbuy.mall.service.MediaService.lambda$deleteTranslationIfUpdated$4(MediaService.java:62)

ich den obigen Fehler auf newLogos.noneMatch ... .. :(

Ich bin mir nicht sicher warum.

Antwort

4

Ihre zweite Stream-Pipeline versucht, den Stream newLogos mehrmals zu verarbeiten. Das ist nicht möglich. Ein Stream kann nur einmal verarbeitet werden.

Sie müssen diesen Stream für jede Ausführung von from.filter() neu erstellen oder einen anderen Weg finden, um das zu erreichen, was Sie versuchen.

Eine Sache, die Sie tun können, ist:

List<MediaTranslation> newLogos = data 
     .map(mediaTranslationMapper::mapToEntity) 
     .collect(Collectors.toList()); 

Nun newLogos ein List ist, so kann sie wiederverwendet werden.

Ersetzen Sie newLogos durch newLogos.stream() in der zweiten Stream-Pipeline.

+0

Danke, für die schnelle Antwort, Strom 101 Lektion gelernt :) –

Verwandte Themen