Java 8 stream API 或Else usage

2022-09-03 01:39:48

我试图做的是过滤列表,然后映射它并使用if,然后将其收集回列表。现在我可以这样实现它:orElsenull

return users.stream()
    .filter(user -> id.equals(user.getId()))
    .map(
        user -> {
            if(user.getData() != null) {
                return user.getData();
            }
            return Collections.emptyMap();
        }
    )
    .collect(Collectors.toList());

但问题是:我怎样才能使这种结构更好,为什么我不能在这种情况下使用?orElse


答案 1

使用三元条件运算符可能更具可读性:

return users.stream()
    .filter(user -> id.equals(user.getId()))
    .map(
        user -> (user.getData() != null) 
        ? user.getData() 
        : emptyMap()
    )
    .collect(Collectors.toList())
;

为了使用,你必须创建一个 包装 .我不确定这是个好主意。orElseOptionaluser.getData()

如果您坚持使用(或者更好的是,,以避免在不需要时进行评估),它可能如下所示:orElseorElseGetemptyMap()

return users.stream()
    .filter(user -> id.equals(user.getId()))
    .map(
        user -> Optional.ofNullable(
            user.getData()
        ).orElseGet(
            () -> emptyMap()
        )
    )
    .collect(Collectors.toList())
;

答案 2

正如我在评论中指出的那样,我非常怀疑您可能只是在寻找以下内容

users
    .stream()
    .filter(
        user -> id.equals(user.getId()) 
        && (user.getData() != null)
    )
    .map(User::getData)
    .collect(Collectors.toList())
;

但是,问题还不够清楚,无法说明语句的最终返回类型是什么,或者代码中使用的是什么!因此,我非常怀疑,如果你首先需要一个API来执行此操作。emptyMapOptional

注意:上述解决方案确实假设这是我不确定为什么想要在表示为的数据结构中收集的。emptyMapCollections.emptyMapList<Map<K,V>>


推荐