Java 8 Неверное исключение потока - PullRequest
2 голосов
/ 07 мая 2020

============== ОБНОВЛЕНО ==============: На самом деле я получаю поток в качестве аргумента моего метода, и я не могу это изменить. И мне нужно обработать его трижды.

MyAggregate aggregate(Stream<IncomingProduct> products){
        Supplier<Stream<IncomingProduct>> streamSupplier
                = () -> products;
        if(streamSupplier.get() == null || !streamSupplier.get().findAny().isPresent()){
            return null;
        }
        List<MyProduct> myProducts = streamSupplier.get()
                .map(p -> new MyProduct(p.getName(), p.getPrice()))
                .collect(Collectors.toList());
        BigDecimal price = myProducts.stream()
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        return new MyAggregate(myProducts,price);
    }
}

Я получаю исключение ниже: Исключение в потоке «main» java .lang.IllegalStateException: поток уже был обработан или закрыт

Ответы [ 2 ]

4 голосов
/ 07 мая 2020

Вы не можете использовать поток дважды. Вашему поставщику необходимо воссоздать его:

    Supplier<Stream<SoldProduct>> streamSupplier
            = () -> Stream.of(s1,s2,s3);
0 голосов
/ 07 мая 2020

Вы не можете использовать поток дважды, как это, после того, как поток был получен с помощью какой-либо операции, такой как map, filter или любой другой операции терминала, например collect, anymatch, et c ,. то вы не можете использовать его снова, вам нужно сохранить продукты в списке, а затем использовать list.stream (), чтобы вы создали новый поток для обеих операций

 List<SoldProduct> products = List.of(s1,s2,s3);
 Supplier<List<SoldProduct>> listSupplier
                = () -> products;
 listSupplier.get().stream().anyMatch(s -> true);
 listSupplier.get().stream().anyMatch(s -> true);
...