Java 8流已经被操作或关闭

Pra*_*r B 5 java lambda java-8 java-stream jhipster

以下是我的代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

以上函数从以下函数调用:

@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);
}
Run Code Online (Sandbox Code Playgroud)

每当我这样做,我得到以下错误:

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上得到了上面的错误..... :(

我不知道为什么.

Era*_*ran 6

您的第二个流管道尝试newLogos多次处理Stream.这是不可能的.流只能处理一次.

您必须为每次执行重新创建该流from.filter(),或者找到一种不同的方式来实现您要执行的操作.

你能做的一件事是:

List<MediaTranslation> newLogos = data
        .map(mediaTranslationMapper::mapToEntity)
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

现在,newLogos是一个List,所以它可以重复使用.

替换newLogosnewLogos.stream()第二流管道.