[英]how can I convert my multiline if statement into a single stream?
我有一個字符串數組:
String[] myArrayString = ...
它可以包含元素或為null。 我寫了以下方法:
String myName = "";
if(myArrayString != null) {
List<String> temp = new ArrayList<>();
for(String tagID : myArrayString) {
Tag tag = tagManager.resolve(tagID);
if (tag != null) {
temp.add(resolveTagName(tag.getName()));
}
}
myName = temp.stream().map(Object::toString).collect(joining(" "));
myName = myName.substring(myName.lastIndexOf("/") + 1);
return myName;
}
我覺得它不夠高效,可能會在一個(或兩個)流中完成。 你能幫我嗎?
您的代碼確實可以轉換為使用一個流。 for循環僅轉換字符串數組的每個元素( map
)並過濾null
元素( filter
),然后執行另一個轉換( map
):
String myName = "";
if(myArrayString != null) {
myName = Arrays.stream(myArrayString)
.map(tagManager::resolve)
.filter(Objects::nonNull)
.map(x -> resolveTagName(x.getName()))
.collect(joining(" "));
myName = myName.substring(myName.lastIndexOf("/") + 1);
return myName;
}
還要注意,流不一定比for循環更有效,因為它也有一些開銷。 要衡量性能,您可以使用探查器,而不僅僅是閱讀代碼。
如果為空,則可以使用Optional
返回空字符串數組,然后使用stream
操作
String myName = Arrays.stream(Optional.ofNullable(myArrayString).orElse(new String[0])) // If array is null return empty string array stream
.map(tagID->tagManager.resolve(tagID)) // return tagId
.filter(Objects::nonNull) // filter non null tagId
.map(str->resolveTagName(tag.getName()).toString()) // return resolveTagName toString representation
.collect(Collectors.joining(" ")); // convert them to string
然后只返回子字符串結果
return myName.substring(myName.lastIndexOf("/") + 1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.