开发者社区 问答 正文

如何最有效地使用Java 8功能在ArrayList中添加或替换自定义对象?

如果自定义对象的特定属性等于要添加的对象的属性,如何使用Java 8替换ArrayList中的自定义对象?如果Arraylist为空,则应添加新对象。如果ArrayList包含元素,我想找出是否有一个具有相同名称的元素,如果存在,则将其替换为新元素,如果没有元素具有新元素的名称,则应将其添加到ArrayList中。

public class MyElement {
    private String name;
    private String value;
}

public class MyElementList {
    private List<MyElement> elements;

    public void add(final MyElement newElement) {
        // By using Java 8 functionality (streams)...
        // add if elements is empty or if newElement is not existent in elements
        // replace oldElement in elements if oldElement.getName().equals(newElement.getName())
    }
}

MyElementList 稍后将转换为JSON,这样一个JSON节点如下所示:

{[
    {
        "name" : "xxx",
        "value" : "yyy"
    },
    {
        "name" : "zzz",
        "value" : "111"
    }
 ]
}

展开
收起
垚tutu 2019-11-28 18:20:30 1048 分享 版权
阿里云 AI 助理回答

在Java 8中,你可以使用Stream API结合Optional来优雅地实现这个逻辑。首先检查列表是否为空,如果为空则直接添加新元素;如果不为空,则尝试找到匹配的元素并替换,或者如果没有匹配项,则添加新元素。以下是修改后的MyElementList类中的add方法:

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

public class MyElementList {
    private List<MyElement> elements = new ArrayList<>();

    public void add(final MyElement newElement) {
        if (elements.isEmpty()) {
            // 如果列表为空,直接添加
            elements.add(newElement);
        } else {
            // 使用Stream API查找是否有相同name的元素
            Optional<MyElement> existingElementOpt = elements.stream()
                    .filter(element -> element.getName().equals(newElement.getName()))
                    .findFirst();

            // 如果找到了匹配的元素,则替换它
            existingElementOpt.ifPresentOrElse(
                    oldElement -> {
                        int index = elements.indexOf(oldElement);
                        elements.set(index, newElement); // 替换
                    },
                    // 如果没有找到匹配的元素,则添加新元素
                    () -> elements.add(newElement)
            );
        }
    }

    // 其他方法...
}

这段代码首先检查elements是否为空。如果是空的,直接添加newElement。如果不是空的,它会创建一个流,使用filter方法找出所有具有与newElement相同名称的元素,并尝试找到第一个匹配项(findFirst)。如果找到了匹配项(通过Optional表示),则使用ifPresentOrElse方法:如果存在匹配项(即Optional包含值),则找到该元素在列表中的位置并用新元素替换它;如果不存在匹配项,则直接将新元素添加到列表中。

这样,你就能根据你的需求处理ArrayList中的自定义对象了。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答