首页 > 解决方案 > 通过 lambda 表达式映射后获取更新的对象

问题描述

我有一个对象列表如下,

ArrayList<Student> students = new ArrayList<>(
        List.of(
                Student.builder().id(1L).name("Joe").build(),
                Student.builder().id(2L).name("Jan").build()
        )
);

我想更新这些对象之一,我有以下实现

return findAll().stream()
            .filter(s -> s.getId() == studentId)
            .map(s -> students.set(students.indexOf(s), Student.builder().id(s.getId()).name(studentPayload.getName()).build()))
            .findFirst()
            .orElseThrow(() -> new StudentNotFoundException(String.format("Student with id [%d] not found", studentId)));

这将返回一个满足基于 的条件的对象filter。不幸的是,这不是最新的对象

映射后如何获取更新的对象?

标签: javajava-stream

解决方案


这是因为seta 的方法List将返回该位置的PREVIOUS元素,而不是新创建的元素。参考

假设您的 id 值是唯一的,我认为使用起来并不整洁,map即使findFirst您可以达到预期的结果。

而是使用findFirst并获取元素,然后作为第二步更新详细信息。

Student sOne = findAll().stream()
                      .filter(s -> s.getId() == studentId)
                      .findFirst()
                      .orElseThrow(() -> new StudentNotFoundException(String.format("Student with id [%d] not found", studentId)));
    
Student sTwo = students.get(students.indexOf(sOne));
if(sTwo!=null) {
    sTwo.setName(studentPayload.getName());
}

return sTwo;

如果您仍想在单行中执行此操作,请使用:

map(s -> {
    Student stu = students.get(students.indexOf(s));
    stu.setName(studentPayload.getName());
    return stu;
}

推荐阅读