Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用流进行从数组到列表的空安全转换_Java_Java Stream - Fatal编程技术网

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

Java 使用流进行从数组到列表的空安全转换,java,java-stream,Java,Java Stream,我正在寻找一种简洁的方法来重写一段Java代码,以便它使用流以空安全的方式将数组转换为列表。以下是原始代码: public MailObject toMailObject(final String[] ccAddresses) { final MailObject mailObject = new MailObject(); // line of code to be altered mailObject.setCcAddresses(ccAddresses == nu

我正在寻找一种简洁的方法来重写一段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());
但我似乎不能完全正确地理解语法

这很有帮助,但并没有完全解决我的问题。谁能给我指一下正确的方向吗?我感觉我很接近


非常感谢您的时间。

在我看来,到目前为止您的代码是完全可读的。我认为对这样的事情使用
,只会使事情变得复杂。如果您仍然希望使用
,则以下类似的操作将起作用:

mailObject.setCcAddresses(Stream.ofNullable(ccAddresses)
          .flatMap(Arrays::stream)
          .collect(Collectors.toUnmodifiableList()));
正如您所看到的,这是一个更难理解的表达式,我不建议您使用它而不是简单的三元表达式


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

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

您可以使用
映射

List<String> ccAddrs = Optional.ofNullable(ccAddress)
                               .map(Arrays::asList)
                               .orElse(Collections.emptyList())
List ccAddrs=可选。不可用(ccAddress)
.map(数组::asList)
.orElse(Collections.emptyList())

您可以尝试使用我的强测试代码:

固定类型方法:

public static List<String> nullSafeConversion(final String[] names) {
     // Initialize all to a list
     List<String> namesList = Arrays.asList(names);
     // Create a null safe Stream
     Stream<String> nameStream = namesList.stream().flatMap(Stream::ofNullable);

     // return collected list from stream
     return nameStream.collect(Collectors.toList());
}
public static <E> List<E> nullSafeConversion(final E[] e) {
    // Initialize all to a list
    List<E> eList = Arrays.asList(e);
    // Create a null safe Stream
    Stream<E> eStream = eList.stream().flatMap(Stream::ofNullable);
    // return collected list from stream
    return eStream.collect(Collectors.toList());
}
产出:

Subarata
Taluker
Software Engineer

您的原始代码似乎足够简洁合理,但我很好奇使用流可以实现的最佳方式。
.map(Arrays::asList)
Stream.of nullable
需要Java 9和
收集器。toUnmodifiableList()
甚至需要Java 10。当您使用Java 9或更高版本时,同样可以将原始代码更改为
mailObject.setccaddress(ccaddress==null?List.of():List.of(ccaddress))
,其简单性将进一步突出使用
可选
的愚蠢。对第一个解决方案使用的Java版本以及
列表()的可能性有很好的了解!在这和@Jacob G的完整答案之间,有很多选择;谢谢我想知道
.map()
方法是否有用;感谢您在上下文中的充分使用。
Subarata
Taluker
Software Engineer