2017-05-28 9 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

2番目のストリームパイプラインは、newLogosストリームを複数回処理しようとします。これは不可能です。ストリームは1回しか処理できません。

from.filter()の実行ごとにそのストリームを再作成するか、実行しようとしていることを達成するための別の方法を見つける必要があります。あなたが行うことができます

ことの一つは、次のとおりです。

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

は今、newLogosListあるので、それを再利用することができます。

newLogosを2番目のストリームパイプラインのnewLogos.stream()に置き換えます。

+0

すばらしい返信のために、ストリーム101のレッスンは:) –

関連する問題