使用流更新列表中的单个对象

iPh*_*Dev 4 java java-8

我有一个对象列表。我需要从与我的过滤器匹配的列表中更新单个对象。我可以执行以下操作:

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,但我认为那个也会很慢。

有什么有效的方法可以做到这一点吗?

Dea*_*ool 7

使用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()` 需要一个返回值。使用 `peek()`,或者更好的是 `findFirst().ifPresent(o -&gt; o.setName("Yahoo"))`。 (2认同)

Raz*_*Raz 4

您可以使用 Map 而不是列表并将 id 保存为键。 https://docs.oracle.com/javase/8/docs/api/java/util/Map.html

然后你可以用 提取它O(1)