java - 从列表中删除元素,哪种代码风格更好?
问题描述
从列表中删除元素,哪种代码风格更好?1:
List<String> newList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if(condition) {
newList.add(list.get(i));
}
}
2:
for (int i = 0; i < list.size();) {
if(!condition) {
list.remove(i);
}else {
i++;
}
}
解决方案
两者都不是,因为您不应该使用索引for
循环来迭代List
.
将变量声明为 aList
而不是a 的意义ArrayList
在于,您可以选择不同的列表实现,例如LinkedList
,并且代码将继续正常运行。但是,get(index)
对于LinkedList
. 相反,使用增强的for
循环,或使用Iterator
.
如果您想要一个新列表,并且保持现有列表不变,请使用增强for
循环:
// Get new list with some elements removed
List<String> newList = new ArrayList<>();
for (String value : list) {
if (condition) {
newList.add(value);
}
}
如果要修改现有列表,请使用Iterator
:
// Remove elements from existing list
for (Iterator<String> iter = list.iterator(); iter.hasNext(); ) {
String value = iter.next();
if (! condition) {
iter.remove();
}
}
更新
在 Java 8+ 中,您可以使用流 / lambda 两种方式:
// Get new list with some elements removed
List<String> newList = list.stream()
.filter(value -> condition)
.collect(Collectors.toList());
// Remove elements from existing list
list.removeIf(value -> ! condition);
推荐阅读
- ruby - 使用新的重试中间件覆盖法拉第连接对象
- delphi - 将所有 Windows 消息捕获到应用程序
- flutter - Flutter - 如何解析自定义小部件中的数组项?
- swift - iOS Crashlytics 未登录 Firebase 仪表板
- blazor - 输入文本值:恢复到以前的值
- stata - 如何在stata estout中引用滞后交互系数?(错误“未找到系数”)
- java - Spark Streaming 开发人员必须在他的计算机上安装 Hadoop 吗?
- react-native - react-native如何处理firebase快照中的数百个数据
- node.js - 你如何让机器人在 node-minecraft-protocol 中移动?
- static - 编写正确的静态路径