Java 使用流进行从数组到列表的空安全转换
我正在寻找一种简洁的方法来重写一段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
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