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

时间:2019-03-21 01:31:20

标签: java java-stream

我正在寻找一种简洁的方法来重写一段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());

但是我似乎无法完全理解语法。

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

非常感谢您的宝贵时间。

3 个答案:

答案 0 :(得分:9)

您可以使用map

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

答案 1 :(得分:6)

我认为,到目前为止,您所拥有的代码是完全可读的。我认为对此类问题使用Stream只会使事情复杂化。如果您仍想使用Stream,则可以使用以下内容:

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

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


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

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

答案 2 :(得分:0)

您可以尝试使用经过严格测试的代码:

固定类型方法:

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

通话方式:

String[] names = {"Subarata", "Talukder", null, "Software Engineer"};
Integer[] marks = {100, 55, null, 25, 66, null, 88};
    
// Print all null safe items
for (String name : nullSafeConversion(names)) {
    // Show null safe data
    System.out.println(name);
}

输出:

Subarata
Taluker
Software Engineer