我有一个可能为null的列表。 我想将该列表中的字符串连接成一个字符串。
例如。一个
list = [“你好”,“那里”]
期望的输出=“hello.there。”
例如。乙
list = null
期望的输出= null
我有一个适用于非空列表的方法:
List<String> myStringList = foo.getlist();
String result = myStringList.stream()
.collect(Collectors.joining(".","","."));
但如果myStringList为null,则流将抛出错误。
我相信我应该使用类似于:
的可选流List<String> myStringList = foo.getlist();
String result = Optional.ofNullable(myStringList)
.map(Arrays::stream)
.orElseGet(Stream::empty)
.collect(Collectors.joining(".","","."))
然而,当我尝试这个时,我会收到“无法解析方法'流'”等错误。
我是以正确的方式来做这件事的吗? 为什么我的代码会出错?
答案 0 :(得分:3)
这是个人意见,但我认为你不应该以这种方式使用Optional
。 Optional
并非旨在取代简单的空检查。如果您已经拥有Optional
,则使用它,或将其用作方法可能缺少的返回值。否则,我认为表达你的确切意图w.r.t更具表现力和可读性。列表为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 */);
答案 1 :(得分:2)
问题在于您是否尝试使用Arrays::stream
将List
转换为流。但是,Arrays::stream
适用于数组。
您需要List::stream
(这是Collection::stream
的继承版本,因此也可以使用):
String result = Optional.ofNullable(myStringList)
.map(List::stream)
.orElseGet(Stream::empty)
.collect(Collectors.joining(".","","."));
答案 2 :(得分:2)
您可以使用 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-列出null:
List<String> myStringList2 = null;
result = Optional.ofNullable(myStringList2).orElse(Collections.emptyList()).stream()
.collect(Collectors.joining(".","","."));
System.out.println(result);
输出:.
如果需要,可以编辑输出
答案 3 :(得分:0)
如果第三方库是游戏,Apache CollectionUtils有一个很好的实用程序可以使列表为null安全:
List<String> myStringList = foo.getlist();
String result = CollectionUtils.emptyIfNull(myStringList).stream()
.collect(Collectors.joining(".","","."));