I have this code
List<Integer> numbers = new ArrayList<>(30, 25, 17, 12 ,8, 5, 3, 2));
List<Integer> indices = new ArrayList<>(5, 3, 2));
Integer newNumber = 1;
for (int i = indices.size() - 1; i >= 0; i--) {
newNumber *= (numbers.get(indices.get(i)));
}
newNumber will be: 5*12*17 = 1020
It is possible to do using stream reduce?
Later I need to remove the indices from the original numbers (I was thinking in filter, but the target is the index not Integer object).
List<Integer> newNumbers = new ArrayList<>(numbers);
for (int i = indices.size() - 1; i >= 0; i--) {
newNumbers.remove(indices.get(i).intValue()); // Remove position
}
Alternatively, I was thinking in this code.
List<Integer> newNumbers2 = new ArrayList<>();
for (int i = 0; i < numbers.size(); i++) {
if (!indices.contains(i)) {
newNumbers2.add(numbers.get(i));
}
}
Is it possible to do it using stream?
Thanks.
Yes you can do it using simple reduction. The identity element of the the reduction is 1 in this case.
int product = indices.stream().mapToInt(numbers::get).reduce(1, (n1, n2) -> n1 * n2);
The answer for the latter question would be,
Set<Integer> indicesSet = new HashSet<>(indices);
List<Integer> newNumbers = IntStream.range(0, numbers.size())
.filter(n -> !indicesSet.contains(n))
.mapToObj(n -> numbers.get(n))
.collect(Collectors.toList());
In mathematics, an identity element is a special type of element of a set with respect to a binary operation on that set, which leaves any element of the set unchanged when combined with it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With