[英]Java stream to collection for nullable string list
我有一个可能为空的列表。 我想将该列表中的字符串连接成一个字符串。
例如。 一
list = ["你好","那里"]
所需的输出 = "hello.there."
例如。 乙
列表 = 空
所需的输出 = 空
我有一个适用于非空列表的方法:
List<String> myStringList = foo.getlist();
String result = myStringList.stream()
.collect(Collectors.joining(".","","."));
但如果 myStringList 为空,流将抛出错误。
我相信我应该使用类似于以下内容的可选流:
List<String> myStringList = foo.getlist();
String result = Optional.ofNullable(myStringList)
.map(Arrays::stream)
.orElseGet(Stream::empty)
.collect(Collectors.joining(".","","."))
但是,当我尝试此操作时,会出现“无法解析方法‘流’”之类的错误。
我会以正确的方式解决这个问题吗? 为什么我收到代码错误?
这是个人意见,但我认为您不应该那样使用Optional
。 Optional
并不打算取代简单的空检查。 如果您已经拥有Optional
,则使用它,或者将其用作方法的可能不存在的返回值。 否则,我认为在列表是否为null
显示您的确切意图更具表现力和可读性:
List<String> myStringList = foo.getlist();
String result = myStringList == null ?
null :
myStringList.stream().collect(Collectors.joining(".","","."));
在这种情况下,三元运算符做得很好。
编辑:
如果连接的字符串是方法的返回值,那么使用Optional
并返回它将是一个完美的选择:
private Optional<String> joinedFooList(Foo foo) {
List<String> myStringList = foo.getlist();
return Optional.ofNullable(myStringList)
.map(l -> l.stream().collect(Collectors.joining(".","",".")));
}
然后,您可以使用返回的Optional
:
joinedFooList(someFooInstance)
.ifPresent(joined -> /* so something with the joined string */);
问题是您正在尝试使用Arrays::stream
将您的List
转换为流。 但是, Arrays::stream
是用于arrays 的。
您需要List::stream
(它是Collection::stream
的继承版本,因此也可以使用):
String result = Optional.ofNullable(myStringList)
.map(List::stream)
.orElseGet(Stream::empty)
.collect(Collectors.joining(".","","."));
你可以使用Collections.emptyList()
1- 列表不为空:
List<String> myStringList = new ArrayList<>() ;
myStringList.add("hello");
myStringList.add("hello");
String result = Optional.ofNullable(myStringList).orElse(Collections.emptyList()).stream()
.collect(Collectors.joining(".","","."));
System.out.println(result);
输出: hello.hello.
2-列表空:
List<String> myStringList2 = null;
result = Optional.ofNullable(myStringList2).orElse(Collections.emptyList()).stream()
.collect(Collectors.joining(".","","."));
System.out.println(result);
输出: .
如果需要,您可以编辑输出
如果第三方库是游戏,Apache CollectionUtils 有一个很好的实用程序可以使列表空安全:
List<String> myStringList = foo.getlist();
String result = CollectionUtils.emptyIfNull(myStringList).stream()
.collect(Collectors.joining(".","","."));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.