java - 通过 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
。不幸的是,这不是最新的对象!
映射后如何获取更新的对象?
解决方案
这是因为set
a 的方法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;
}
推荐阅读
- c++ - OpenMP 并行函数调用对象迭代
- sql - MSSQL 案例语句
- angular - 在我看来,这个用于执行插入到输入标签中的术语的动态搜索的 Angular 管道是如何工作的?
- grammar - Q: ANTLR 4 语法识别整个奇数值不仅仅是最后一个数字
- php - 如何使用php中的循环计算学习同一分支、年份、学期的学生
- php - 如果节点与 Xpath 一起存在,则修改属性?
- scala - 未来尚未完成,但看起来已经完成
- amazon-web-services - AWS Cognito 针对不同用户池刷新令牌也会返回有效令牌
- php - 未定义的变量:Laravel 5.6 应用程序中的名称?
- sql - 对表中的所有行求和