[英]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.