使用 lambda 的内联进行筛选,避免意外的 null

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

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

怎么可能回来.usersRepository.findEnabledByUsernamenull

当然,我可以这样做:

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

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


答案 1

您可以在运行部件之前执行映射 + 过滤,这也使其更具可读性: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));

答案 2

@assylias answser的一些替代品。

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

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

是否可以使用方法进行更新UserEntitydisable

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

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

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

一些资源:


推荐