【发布时间】:2016-03-10 22:37:17
【问题描述】:
我有以下课程:
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 ,这应该可以消除异常。谢谢。
【问题讨论】:
-
您对列表中的索引和 lambda 中的当前项目使用相同的变量 i。选择一个不同的名称。该代码很好,但效率很低。如果你有多个 id 并且需要为所有找到对应的项目,首先创建一个 HashMap
,然后使用 HashMap。 -
我在我的代码中使用了不同的变量,我试图在这里简化代码。我会改的。
-
在循环中声明变量
idinside,它实际上是最终的。通过在外面,您在每次迭代时重新初始化它,因此它不是最终的。在尽可能小的范围内声明变量通常是最佳实践。 -
是的,我也是这么想的。感谢您的建议。
-
BTW 循环也一样,使用
for (int i = 0; i < ids.size(); i++),或者更好更简单:for (Integer id : ids)
标签: java lambda java-8 java-stream