使用流进行从数组到列表的空安全转换

ris*_*ide 9 java java-stream

我正在寻找一种简洁的方法来重写一段Java代码,以便它使用流以null安全的方式将流转换为数组。这是原始代码:

public MailObject toMailObject(final String[] ccAddresses) {
    final MailObject mailObject = new MailObject();

    // line of code to be altered
    mailObject.setCcAddresses(ccAddresses == null 
        ? Collections.emptyList() : Arrays.asList(ccAddresses));

    // other necessary code

    return mailObject;
}
Run Code Online (Sandbox Code Playgroud)

我想过要做这样的事情:

// psuedocode that obviously doesn't compile
Optional.ofNullable(ccAddresses).SOMETHING.orElse(Collections.emptyList());
Run Code Online (Sandbox Code Playgroud)

其中的某些内容如下:

Arrays.stream(ints).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但我似乎语法不太正确。

这个问题很有帮助,但没有完全解决我的问题。有人能指出我正确的方向吗?我觉得我已经接近了...

非常感谢您的宝贵时间。

Mạn*_*yễn 9

您可以使用map

List<String> ccAddrs = Optional.ofNullable(ccAddress)
                               .map(Arrays::asList)
                               .orElse(Collections.emptyList())
Run Code Online (Sandbox Code Playgroud)


Jac*_* G. 6

我认为,到目前为止,您所拥有的代码是完全可读的。我认为将a Stream用于此类操作只会使事情复杂化。如果您仍然想使用Stream,则可以使用以下方法:

mailObject.setCcAddresses(Stream.ofNullable(ccAddresses)
          .flatMap(Arrays::stream)
          .collect(Collectors.toUnmodifiableList()));
Run Code Online (Sandbox Code Playgroud)

如您所见,这是一种更难以理解的方法,我不建议您在简单的三元表达式上使用它。


您的Optional解决方案更具可读性,如下所示:

mailObject.setCcAddresses(Optional.ofNullable(ccAddresses)
          .map(Arrays::asList)
          .orElse(Collections.emptyList()));
Run Code Online (Sandbox Code Playgroud)

  • Stream.ofNullable需要Java 9,Collectors.toUnmodifiableList()需要Java10。使用Java 9或更高版本时,您也可以将原始代码更改为mailObject.setCcAddresses(ccAddresses == null? List.of():List.of(ccAddresses));`的简洁性将在这里更加突出地显示使用`Optional`或`Stream`的愚蠢行为。 (5认同)