我有一个用户ID列表,我需要首先检查数据库以查看用户ID是否存在,如果不存在,请忽略此用户ID,否则,请在数据库中更新此用户信息。我无法更改updateUserInDB
方法,所以如果updateUserInDB
返回checkDBforId
,如何让代码跳过调用null
?下面的代码无法按我想要的方式工作。
ArrayList<User> updatedUserList = userList.stream().map(user -> updateUserInDB(checkDBforId(user.getId()))
.collect(Collectors.toList());
我能想到的是使用两个流,并分两步执行checkDBforId
和updateUserInDB
,但是想知道是否有一种方法可以一步完成。谢谢。
validUserList = userList.stream().map(user -> checkDBforId(user.getId()))
.filter(Objects::nonNull)
.collect(Collectors.toList());
updatedUserList = validUserList.stream().map(user -> updateUserInDB(user))
.collect(Collectors.toList());
User类包含id
和name
字段。方法界面:
User checkDBforId(Integer userId) {
// if userId exists in DB, return the user object from DB,
// otherwise, return null;
}
User updateUserInDB(User user) {
// update this user in the database;
}
答案 0 :(得分:0)
按照JBNIzet的建议,在单个流管道中,您可以使用checkUserInDB
来构造filter
谓词。
List<User> updatedUserList = userList.stream()
.filter(user -> checkDBforId(user.getId()) != null)
.map(user -> updateUserInDB(user))
.collect(Collectors.toList());
另一方面,数据库通常具有modifyIfExists
功能,可以使您免于两次针对这种结构的数据库查询。 (甚至在其中很少的update
操作中,都是基于键旁边数据的存在。)