使用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表达式