Loops 如何将for循环转换为stream循环
如何将此代码转换为流循环:Loops 如何将for循环转换为stream循环,loops,lambda,java-8,java-stream,Loops,Lambda,Java 8,Java Stream,如何将此代码转换为流循环: for(long l = 1L; l <= 250000; l++) { v = value.add(BigInteger.valueOf(myMethod.getInt())); } 用于(长l=1L;长l 另一个答案是IntStream.generate(myMethod::getInt)和limit更优雅:)基本上,它看起来像你的myMethod.getInt方法是一个生成器。因此,在我看来,最好的办法是 这更清楚,因为您不必指定范围-范围不是
for(long l = 1L; l <= 250000; l++) {
v = value.add(BigInteger.valueOf(myMethod.getInt()));
}
用于(长l=1L;长l
另一个答案是IntStream.generate(myMethod::getInt)
和limit
更优雅:)基本上,它看起来像你的myMethod.getInt
方法是一个生成器。因此,在我看来,最好的办法是
这更清楚,因为您不必指定范围-范围不是您所关心的,元素的数量是(即范围的大小)。映射时也不必忽略参数。我只需要运行myMethod.getInt()25000次。myMethod.getInt()返回一个随机整数。使用此代码,我无法获得总和的最终值。像int value=IntStream.range(0025000).map(i->myMethod.getInt()).mapToObj(biginger::valueOf).map(value::add)一样,我得到了两个错误:错误:(16,96)java:不兼容的类型:long无法转换为java.math.BigDecimal错误:(16,79)java:不兼容的类型:没有类型变量的实例U的存在使得java.util.stream.stream符合java.math。BigDecimal@Roland如果value
收集可以使用.reduce(BigInteger.valueOf(0),BigInteger::add)的总和而不是BigInteger.valueOf(0)
,则可以使用BigInteger.ZERO
。另一种解决方案是IntStream.generate(myMethod::getInt).limit(25000).mapToObj(biginger::valueOf).
或Stream.generate(()->biginger.valueOf(myMethod.getInt()).limit(25000).
@Michael nope,反正我把它作为建议发布,而不是作为答案。除此之外,同时找到这样的规范解决方案并不罕见。@Roland a)错误的基准方法b)在myMethod.getInt()中发生的任何事情(例如,使用同步随机生成器)。如果所有这些方法都返回一个随机整数,那么biginger result=ThreadLocalRandom.current().ints(25000[min,max])[.parallel()].mapToObj(biginger::valueOf).reduce(biginger.ZERO,biginger::add)如何代码>?尽管如此,要将25000
int
值相加,您无论如何都不需要biginger
,因为即使long
值范围也足够了。
BigInteger result = IntStream.range(0, 25000)
.map(i -> myMethod.getInt())
.mapToObj(BigInteger::valueOf)
.reduce(BigInteger.valueOf(0), BigInteger::add)
IntStream.generate(myMethod::getInt)
.mapToObj(BigInteger::valueOf)
.limit(25000)
.reduce(BigInteger.ZERO, BigInteger::add)