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.
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.
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 :)
value collects the sum you can go with .reduce(BigInteger.valueOf(0), BigInteger::add)BigInteger.valueOf(0), you can use BigInteger.ZERO. Alternative solution are IntStream.generate(myMethod::getInt).limit(25000).mapToObj(BigInteger::valueOf) … or Stream.generate(() -> BigInteger.valueOf(myMethod.getInt())).limit(25000) ….myMethod.getInt() (e.g. using a synchronized random generator). If all this method does, is returning a random int, how about BigInteger result = ThreadLocalRandom.current().ints(25000, [min, max]) [.parallel()] .mapToObj(BigInteger::valueOf).reduce(BigInteger.ZERO, BigInteger::add);? Though, to sum up 25000 int values, you don’t need BigInteger anyway, as even the long value range is sufficient.