通过 lambda 表达式映射后获取更新的对象
Get updated object after mapping by lambda expression
我有如下对象列表,
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)));
这个returns一个对象满足filter
的条件。不幸的是,这是一个不是最新的对象!
映射后如何获取更新后的对象?
这是因为 List
的 set
方法会 return 该位置的 PREVIOUS 元素,而不是新创建的元素. Refer
假设您的 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;
}
我有如下对象列表,
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)));
这个returns一个对象满足filter
的条件。不幸的是,这是一个不是最新的对象!
映射后如何获取更新后的对象?
这是因为 List
的 set
方法会 return 该位置的 PREVIOUS 元素,而不是新创建的元素. Refer
假设您的 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;
}