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)