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流/映射来编写,但是我似乎无法弄清楚如何将所有内容连接在一起。有什么想法吗?
答案 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