Java 8流非法异常
======================更新===============================================: 事实上,我得到了流作为我的方法的参数,我不能改变这一点。我必须处理三次Java 8流非法异常,java,java-8,java-stream,Java,Java 8,Java Stream,======================更新===============================================: 事实上,我得到了流作为我的方法的参数,我不能改变这一点。我必须处理三次 MyAggregate aggregate(Stream<IncomingProduct> products){ Supplier<Stream<IncomingProduct>> streamSupplier
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);
}
}
我得到以下例外:
线程主java.lang.IllegalStateException中的异常:流已被操作或关闭一旦通过任何操作(如map、filter或任何其他终端操作(如collect、anymatch等)访问流,您就不能像这样使用流两次,。然后您不能再次使用它,您必须将产品存储在列表中,然后使用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);
一旦使用任何操作(如map、filter或任何其他终端操作(如collect、anymatch等)访问流,您就不能像这样使用流两次,。然后您不能再次使用它,您必须将产品存储在列表中,然后使用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);
一条流不能消耗两次。您的供应商需要重新创建它:
Supplier<Stream<SoldProduct>> streamSupplier
= () -> Stream.of(s1,s2,s3);
一条流不能消耗两次。您的供应商需要重新创建它:
Supplier<Stream<SoldProduct>> streamSupplier
= () -> Stream.of(s1,s2,s3);
一个流不能使用两次。不管“对象名”应该是什么,都没有区别。仍然是相同的错误,供应商->产品总是返回相同的流对象。什么都没有。只需删除此声明以及后续的if语句。只需使用List myProducts=products.mapp->new MyProductp.getName、p.getPrice.collectCollectors.toList;代码中没有“特定处理”。当参数为null时,只有一个可疑的null处理返回null,而当流为空而没有任何需要时,更糟糕的行为返回null。仅执行collect操作将为空流提供一个空结果列表,这是合理的。在这种情况下,如果你仍然需要做特殊的手术,在那一点上仍然是可能的。如果您坚持可疑的null处理,ifproducts==null返回null;如前所述,ifproducts==null返回null;即使不建议使用编码样式,也可以使用。另外,如前所述,当您执行List myProducts=products.mapp->new MyProductp.getName、p.getPrice.collectCollectors.toList;,对于空流,没有问题,它只会计算为一个空列表,因此在空流的情况下,您想做的任何事情都可以在这之后完成,就像ifmyProducts.isEmpty{/*您的特殊操作*/}。您不能使用流两次。无论“对象名”应该是什么,都没有区别。仍然是相同的错误,供应商->产品总是返回相同的流对象。什么都没有。只需删除此声明以及后续的if语句。只需使用List myProducts=products.mapp->new MyProductp.getName、p.getPrice.collectCollectors.toList;代码中没有“特定处理”。当参数为null时,只有一个可疑的null处理返回null,而当流为空而没有任何需要时,更糟糕的行为返回null。仅执行collect操作将为空流提供一个空结果列表,这是合理的。在这种情况下,如果你仍然需要做特殊的手术,在那一点上仍然是可能的。如果您坚持可疑的null处理,ifproducts==null返回null;如前所述,ifproducts==null返回null;即使不建议使用编码样式,也可以使用。另外,如前所述,当您执行List myProducts=products.mapp->new MyProductp.getName、p.getPrice.collectCollectors.toList;,对于空流,没有问题,它只会计算为一个空列表,因此在出现空流的情况下,您想做的任何事情都可以在这之后完成,就像ifmyProducts.isEmpty{/*您的特殊操作*/}。或者,将其保留为供应商,并使用->products.stream。或者,将其保留为供应商,并使用->products.stream。