簡體   English   中英

如何將多行if語句轉換為單個流?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM