Java 8流API或Else用法

Tyu*_*pan 16 java java-8 java-stream

我要做的是过滤列表,然后映射它并使用orElseif null然后将其收集回列表.现在我可以通过这种方式实现它:

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

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

Era*_*ran 14

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

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

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

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

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

  • Java 9+:`.map(user - > Objects.requireNonNullElse(user.getData(),emptyMap()))`.三元运算符的缺点是它可能会两次调用`getData()`. (5认同)