2017-05-28 26 views
4

下面是我的代碼:Java的8個流已在運行或關閉

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); 
} 

以上函數是從下面的函數調用:

@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); 
} 

每當我這樣做,我得到的以下錯誤:

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)

我得到newLogos.noneMatch上述錯誤... .. :(

我不知道爲什麼。

回答

4

您的第二個流管道嘗試多次處理newLogos流。這不可能。流只能處理一次。

您將不得不爲每次執行from.filter()重新創建該流,或者找到一種不同的方式來實現您正在嘗試執行的操作。

一兩件事你可以做的是:

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

現在,newLogosList,因此它可以被重新使用。

在第二流管線中將newLogos替換爲newLogos.stream()

+0

謝謝,快速回復,第101課的經驗教訓:) –