Java Stream如果另一个方法返回null

时间:2019-11-18 22:19:40

标签: java java-8 java-stream

我有一个用户ID列表,我需要首先检查数据库以查看用户ID是否存在,如果不存在,请忽略此用户ID,否则,请在数据库中更新此用户信息。我无法更改updateUserInDB方法,所以如果updateUserInDB返回checkDBforId,如何让代码跳过调用null?下面的代码无法按我想要的方式工作。

 ArrayList<User> updatedUserList = userList.stream().map(user -> updateUserInDB(checkDBforId(user.getId()))
                                    .collect(Collectors.toList());

我能想到的是使用两个流,并分两步执行checkDBforIdupdateUserInDB,但是想知道是否有一种方法可以一步完成。谢谢。

  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类包含idname字段。方法界面:

  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;
  }

1 个答案:

答案 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操作中,都是基于键旁边数据的存在。)