gpt4 book ai didi

Java 8 streams/maps/filters 动态修改或删除列表元素

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:00:51 25 4
gpt4 key购买 nike

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

最佳答案

因为您正在使用 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());
}

关于Java 8 streams/maps/filters 动态修改或删除列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55520626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com