使用lambda的内联过滤避免意外的null

我有我想要做的每个元素的列表(使用Java 8):

disabledUsersOnLDAP.stream().forEach(user ->usersRepository.findEnabledByUsername(user.getUserName()).setEnabled(false)); 

usersRepository.findEnabledByUsername怎么可能返回null。 当然,我可以这样做:

 disabledUsersOnLDAP.stream().forEach(user -> { UserEntity userEntity = usersRepository.findEnabledByUsername(user.getUserName()); { if (userEntity != null) { userEntity.setEnabled(false); } } }); 

但我想知道我是否可以进行内联空检查(在第一个选项中)?

你可以在运行forEach部分之前进行映射+过滤,这也使它更具可读性:

 disabledUsersOnLDAP.stream() .map(user -> usersRepository.findEnabledByUsername(user.getUserName())) .filter(userEntity -> userEntity != null) .forEach(userEntity -> userEntity.setEnabled(false)); 

或者作为替代方案:

 disabledUsersOnLDAP.stream() .map(User::getUsername) .map(usersRepository::findEnabledByUsername) .filter(Objects::nonNull) .forEach(userEntity -> userEntity.setEnabled(false)); 

@assylias 答案的一些替代方案。

使用Objects == nonNull的方法引用进行null检查:

 disabledUsersOnLDAP.stream() .map(User::getUsername) .map(usersRepository::findEnabledByUsername) .filter(Objects::nonNull) .forEach(userEntity -> userEntity.setEnabled(false)); 

如果您可以使用disable方法更新UserEntity

 class UserEntity { public void disable() { setEnabled(false); } } 

你可以再次使用方法引用( UserEntity::disable ):

 disabledUsersOnLDAP.stream() .map(User::getUsername) .map(usersRepository::findEnabledByUsername) .filter(Objects::nonNull) .forEach(UserEntity::disable); 

一些资源:

  • 关于java教程的方法参考
  • JSR 335:JavaTM编程语言的Lambda表达式