Java 8流/映射/过滤器可即时修改或删除列表元素

时间:2019-04-04 16:12:18

标签: java java-8 java-stream

Java 8在这里。寻找一种(可能基于流的)“ Java 8”方式来替换和/或删除List中的对象。这是我的代码:

public void applyChanges(List<Fizz> fizzes, Action action, Fizz toModify) {
  int i = 0;
  for (Fizz fizz : fizzes) {
    i++;
    if (fizz.getId() == toModify.getId()) {
      switch(action) {
      case Replace:
        // Here we want to replace 'fizz' in the list
        // with 'toModify' however order/sequence doesn't matter.
        fizzes.remove(i);
        fizzes.add(toModify);
        break;
      case Delete:
      default:
        // Here we just want to remove the Fizz with the matching
        // ID from 'fizzes'.
        fizzes.remove(i);
        break;
      }
    }
  }
}

我认为这可以更高效/更简洁地编写,也可以利用Java 8流/映射来编写,但是我似乎无法弄清楚如何将所有内容连接在一起。有什么想法吗?

2 个答案:

答案 0 :(得分:8)

因为您使用void作为返回类型,并且想要使用Stream修改给定的List并不是最佳解决方案。您可以使用List.replaceAll()List.removeIf()来完成一个简单的if语句:

public void applyChanges(List<Fizz> fizzes, Action action, Fizz toModify) {
    if (action == Action.Replace) {
        fizzes.replaceAll(fizz -> fizz.getId() == toModify.getId() ? toModify : fizz);
    } else {
        fizzes.removeIf(fizz -> fizz.getId() == toModify.getId());
    }
}

如果您要执行的操作多于替换和删除操作,则可以使用switch语句代替if

如果您真的想使用Streams,我还将分开不同的操作。您还必须在方法中返回新的List,然后将其重新分配给传递给该方法的变量:

public List<Fizz> applyChanges(List<Fizz> fizzes, Action action, Fizz toModify) {
    if (action == Action.Replace) {
        return fizzes.stream()
                .map(fizz -> fizz.getId() == toModify.getId() ? toModify : fizz)
                .collect(Collectors.toList());
    }
    return fizzes.stream()
            .filter(fizz -> fizz.getId() != toModify.getId())
            .collect(Collectors.toList());
}

答案 1 :(得分:2)

您可以将@n用于类似以下内容的流:

map