我有以下课程:
public class Item {
int id;
String name;
// few other fields, contructor, getters and setters
}
我有一个项目列表。我想遍历列表并找到具有特定 ID 的实例。我正在尝试通过流来做到这一点。
public void foobar() {
List<Item> items = getItemList();
List<Integer> ids = getIdsToLookup();
int id, i = ids.size() - 1;
while (i >= 0) {
id = ids.get(i);
Optional<Item> item = items
.stream()
.filter(a -> a.getId() == id)
.findFirst();
// do stuff
i--;
}
}
这是遍历列表并获取我需要的元素的最佳方式吗?此外,我在 id 的过滤器行上收到一条错误消息,指出 lambda 表达式中使用的变量必须是最终变量或实际上是最终变量。也许我可以在 while 循环中定义 id,这样应该可以消除异常。谢谢。
原文由 Gengis Khan 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您有很多要搜索的 ID,建议使用一次性完成的解决方案,而不是对每个 ID 进行线性搜索:
第一条语句只是从 ids 列表中创建一个映射,将每个搜索 id 映射到一个空的
Optional
。第二条语句使用
forEach
迭代项目,对于每个项目,它检查是否存在从其 id 到空的映射Optional
并将其替换为Optional
封装项目,如果有这样的映射,一次操作,computeIfPresent
。最后一个
for
循环在ids
列表上向后迭代,因为您希望按该顺序处理它们并在存在非空时执行操作Optional
-596由于地图是用列表中找到的所有 ID 初始化的,get
永远不会返回null
,它将返回一个空的Optional
,如果没有找到 id在items
列表中。这样,假设
Map
的查找具有O(1)
时间复杂度,这是典型实现中的情况,净时间复杂度从O(m×n)
-c743O(m+n)
b 更改为---
…