我有一个对象列表。我需要从与我的过滤器匹配的列表中更新单个对象。我可以执行以下操作:
List<MyObject> list = list.stream().map(d -> {
if (d.id == 1) {
d.name = "Yahoo";
return d;
}
return d;
});
Run Code Online (Sandbox Code Playgroud)
但我担心的是我喜欢遍历整个列表,可能多达 20k 条记录。我可以做一个for loopthen break,但我认为那个也会很慢。
有什么有效的方法可以做到这一点吗?
使用findFirstso 找到列表中第一个匹配元素后剩余的元素不会被处理
Optional<MyObject> result = list.stream()
.filter(obj->obj.getId()==1)
.peek(o->o.setName("Yahoo"))
.findFirst();
Run Code Online (Sandbox Code Playgroud)
或者
//will not return anything but will update the first matching object name
list.stream()
.filter(obj->obj.getId()==1)
.findFirst()
.ifPresent(o->o.setName("Yahoo"));
Run Code Online (Sandbox Code Playgroud)
您可以使用 Map 而不是列表并将 id 保存为键。 https://docs.oracle.com/javase/8/docs/api/java/util/Map.html
然后你可以用 提取它O(1)。