Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用lambda'过滤以避免意外的空值;s内联_Java_Lambda_Java 8_Nullpointerexception_Nullable - Fatal编程技术网

Java 使用lambda'过滤以避免意外的空值;s内联

Java 使用lambda'过滤以避免意外的空值;s内联,java,lambda,java-8,nullpointerexception,nullable,Java,Lambda,Java 8,Nullpointerexception,Nullable,我有每个元素的列表,我想这样做(使用Java 8): 然而,usersRepository.findEnabledByUsername可能返回null 当然,我可以这样做: disabledUsersOnLDAP.stream().forEach(user -> { UserEntity userEntity = usersRepository.findEnabledByUsername(user.getUserName()); { if (userEnt

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

然而,
usersRepository.findEnabledByUsername
可能返回
null

当然,我可以这样做:

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

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

您可以在运行
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的一些替代方案

使用方法引用进行
null
检查:

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

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

class UserEntity {
    public void disable() {
        setEnabled(false);
    }
}
您可以再次使用方法引用(
UserEntity::disable
):


一些资源:


  • 你考虑过这种新型的吗?如果某些内容可能返回null,则最好返回一个空的可选值。过滤非空选项也很容易。还有一件事。如果在最后一行中,在foreach子句中,我想做更多的逻辑,你怎么能修改它?假设在setEnable之后,我想将每个userEntity发送到doSomething()方法。
    .forEach(userEntity->{userEntity.setEnabled(false);sososomething(userEntity);})userEntity!=null).forEach(userEntity->{userEntity.disable();cleanUserTicket(userEntity.getUsername());});@rayman好的。除非你有一个特定的方法来做这些事情,否则你不能使用方法引用。需要注意的是,这个方法不一定在UserEntity上;它可以是一个静态方法,也可以是一个可访问对象的方法。使用方法引用的优点是,你引用了一个命名方法,目的更清楚。
    
    class UserEntity {
        public void disable() {
            setEnabled(false);
        }
    }
    
    disabledUsersOnLDAP.stream()
        .map(User::getUsername)
        .map(usersRepository::findEnabledByUsername)
        .filter(Objects::nonNull)
        .forEach(UserEntity::disable);