我尝试使用Stream API生成Order示例。我有一个创建订单的工厂函数,并使用DoubleStream初始化订单金额。
private DoubleStream doubleStream = new Random().doubles(50.0, 200.0);
private Order createOrder() {
return new Order(doubleStream.findFirst().getAsDouble());
}
@Test
public void test() {
Stream<Order> orderStream = Stream.generate(() -> {
return createOrder();
});
orderStream.limit(10).forEach(System.out::println);
...
}
如果我使用literal(1.0)初始化Order
示例,这可以正常工作。
6条答案
按热度按时间ohtdti5x1#
答案在
Stream
的javadoc中(重点是我的):一个流只能操作一次(调用中间流或终端流操作)。这就排除了“分叉”流,即同一个源馈送两个或多个管道,或者同一个流的多次遍历。流实现如果检测到流被重用,可能会抛出IllegalStateException。
在您的代码中,确实使用了两次流(一次在
createOrder()
中,另一次在.limit().forEach()
中使用iqxoj9l92#
正如在其他答案中所说,
Stream
是一次性使用的物品,每次需要时都必须创建一个新的Stream
。但是,毕竟,当你删除所有存储中间结果的尝试时,这并不复杂。你的整个代码可以表示为:
甚至更简单
nue99wik3#
As fge states,您不能(不应该)多次使用
Stream
。有办法解决吗?
从
Random#doubles(double, double)
的Javadoc生成伪随机双精度值,就好像它是使用原点和边界调用以下方法的结果:
实现这样一个方法,每次你需要一个新的
double
值时,用它来获取一个新的double
值,而不是试图从DoubleStream
获取它。如果不打算重用
nextDouble
方法,可以内联值50.0
和200.0
。mznpcxlj4#
谢谢--这非常有帮助。我还提出了一个不同的实现,目前运行良好:
再次感谢!
奥莱
xesrikrc5#
您的方法可以是这样的一行程序。
sigwle7e6#
您应该使用Supplier函数接口进行初始化,如下所示
然后改变你的方式得到双倍像这样
然后它正常工作。
从帖子Stream has already been operated upon or closed Exception找到了这个方法