有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用lambda的inline避免意外null的java筛选

我有每个元素的列表,我想这样做(使用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);
        }
    }
});

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


共 (2) 个答案

  1. # 1 楼答案

    @assyliasanswser的一些替代方案

    使用对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);
    

    一些资源:

  2. # 2 楼答案

    您可以在运行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));