Java 使用lambda'过滤以避免意外的空值;s内联
我有每个元素的列表,我想这样做(使用Java 8): 然而,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
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);})如果我想在最后一个forEach中添加另一个方法调用。如何将其组合在一起?您能举个例子吗?DisabledUsersOnDap.stream().map(UserLdap::getUserName).map(usersRepository::findEnabledByUsername).filter(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);