Java 查找并修改ArrayList中的特定元素

Java 查找并修改ArrayList中的特定元素,java,arrays,lambda,Java,Arrays,Lambda,是否有一种优雅的方法可以在java中查找和修改某些特定对象?我有这样的方法: public update(MyObj o) { for (MyObj objToModify: DATA) { if (objToModify.getId() == o.getId()) { objToModify.setName(o.getName()); // and so on ... } } } 例如,是否可以重写为lamb

是否有一种优雅的方法可以在java中查找和修改某些特定对象?我有这样的方法:

public update(MyObj o) {
   for (MyObj objToModify: DATA) {
       if (objToModify.getId() == o.getId()) {
           objToModify.setName(o.getName());
           // and so on ...
       }
   }
}

例如,是否可以重写为lambda或Java8的某些其他功能?我有很多属性,因此我会选择一些无法手动编写的选项来设置所有新属性。

您可以通过以下方式执行此操作,这将覆盖整个流并更新元素,即使有多个匹配项:

DATA.stream().filter(a -> a.getId() == o.getId()).forEach(a -> a.setName(o.getName()));
或者,如果您确定只需要更新一个元素:

DATA.stream().filter(a -> a.getId() == o.getId()).
    findAny().ifPresent(a -> a.setName(o.getName()));

两种解决方案都将抛出
NullPointerException
如果数据具有与原始解决方案相同的null元素,如果它是一种可能性,并且您想要阻止它,那么您还需要检查
filter

中的
a
是否不为null。您可以使用lambda表达式来执行您试图执行的操作

public update(MyObj o) {

    DATA.forEach(objToModify -> {

        if (objToModify.getId() == o.getId()) {
            objToModify.setName(o.getName());
            // and so on ...
        }
    });   
}

虽然我不确定在您的案例中使用
lambda表达式是否比在每个
循环中使用
更有效。

建议-不应局限于
findFirst
@nullpointer不确定OP想要什么,但我将您的建议整合到了答案中。我已根据正确性需要更新了我的问题,是否可以在不手动写入setID、setName、setDate等的情况下自动更新映射绑定属性?@DenisStephanov如果需要在某个地方执行此操作,您可以向MyObj添加一个方法
@Oleg我有最后一个问题,如果我想设置更多属性而不仅仅是名称,该怎么办?你能编辑这个例子吗?看起来你最好使用
地图
直接访问对象。你能给我一个例子作为答案吗?