Java 8,流与另一个基于列表索引

标签 java java-8 java-stream reduce

我有这个代码

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 将是:5*12*17 = 1020

可以使用stream reduce吗?

稍后我需要从原始数字中删除索引(我在过滤器中考虑,但目标是索引而不是 Integer 对象)。

List<Integer> newNumbers = new ArrayList<>(numbers);
for (int i = indices.size() - 1; i >= 0; i--) {
  newNumbers.remove(indices.get(i).intValue()); // Remove position
}

或者,我在考虑这段代码。

List<Integer> newNumbers2 = new ArrayList<>();
for (int i = 0; i < numbers.size(); i++) {
  if (!indices.contains(i)) {
    newNumbers2.add(numbers.get(i));
  }
}

是否可以使用流来实现?

谢谢。

最佳答案

是的,你可以使用简单的减少来做到这一点。在这种情况下,归约的标识元素为 1。

int product = indices.stream().mapToInt(numbers::get).reduce(1, (n1, n2) -> n1 * n2);

后一个问题的答案是,

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.

关于Java 8,流与另一个基于列表索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56014539/

相关文章:

java - Magento catalogCategoryAttributeList SOAP API 调用不返回所有属性

Java 8 UTF-8 编码问题(java 错误?)

java - 使用 Java Streams 从嵌套列表中 findAny

java - 为什么Map api不提供Java中的流功能?

java-8 - 一股上游流向多股下游流供料

java - HttpServletRequest - 获取查询字符串参数,无表单数据

java - Spring+Hibernate+java :Connecting to multiple database after running application

java - 使用 JRE 1.7 排序时哪个类抛出 IllegalArgumentException?

Java 8 通用 java.util.Function

javascript - 使用streams().reduce 从ArrayList<Integer> 构建一个字符串?