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

2022-09-04 19:28:55

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

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;
}

我想过做这样的事情:

// psuedocode that obviously doesn't compile
Optional.ofNullable(ccAddresses).SOMETHING.orElse(Collections.emptyList());

其中某些内容将类似于:

Arrays.stream(ints).collect(Collectors.toList());

但我似乎不能得到语法完全正确。

这个问题很有帮助,但并没有完全解决我的问题。任何人都可以为我指出正确的方向吗?我觉得我很接近...

非常感谢您抽出宝贵时间接受采访。


答案 1

您可以使用 :map

List<String> ccAddrs = Optional.ofNullable(ccAddress)
                               .map(Arrays::asList)
                               .orElse(Collections.emptyList())

答案 2

在我看来,到目前为止,您拥有的代码是完全可读的。我认为使用 a 来表示这样的事情只会使事情复杂化。如果您仍然想使用 ,则如下所示的内容将起作用:StreamStream

mailObject.setCcAddresses(Stream.ofNullable(ccAddresses)
          .flatMap(Arrays::stream)
          .collect(Collectors.toUnmodifiableList()));

如您所见,这是一个更难读的内容,我不建议将其放在简单的三元表达式上。


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

mailObject.setCcAddresses(Optional.ofNullable(ccAddresses)
          .map(Arrays::asList)
          .orElse(Collections.emptyList()));

推荐