How to transform a for loop into stream loop

Viewed 73

How to transform this code into a stream loop:

for(long l = 1L; l <= 250000; l++) {
     v = value.add(BigInteger.valueOf(myMethod.getInt()));
}

I need to get the 'v' as a unique BigInteger value.

2 Answers

Fundamentally, it looks like your myMethod.getInt method is a generator. Therefore, the best way to do this, in my opinion, is to create an infinite stream from your generator.

IntStream.generate(myMethod::getInt)
    .mapToObj(BigInteger::valueOf)
    .limit(25000)
    .reduce(BigInteger.ZERO, BigInteger::add)

This is clearer because you don't have to specify a range - the range is not what you care about, the number of elements is (i.e. the size of the range). You also don't have to ignore the parameter when you're mapping.

BigInteger result = IntStream.range(0, 25000)
  .map(i -> myMethod.getInt())
  .mapToObj(BigInteger::valueOf)
  .reduce(BigInteger.valueOf(0), BigInteger::add)

Another answer with IntStream.generate(myMethod::getInt) and limit is more elegant :)

Related