如何将多行if语句转换为单个流?

问题描述 投票:0回答:2

我有一个字符串数组:

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;
    } 

但是我感觉效率不够高,可能会在一个流中(或者可能是两个?)完成。你能帮我吗?谢谢!

java stream
2个回答
1
投票

您的代码确实可以转换为使用一个流。 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()))
                        // from this point onwards it's your own code
                        .map(Object::toString).collect(joining(" "));
    myName = myName.substring(myName.lastIndexOf("/") + 1);
    return myName;
} 

0
投票

您可以将Optionalstream一起使用

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 tagName toString representation 
                      .collect(Collectors.joining(" "));         // convert them to string

然后执行子字符串操作

myName = myName.substring(myName.lastIndexOf("/") + 1);
return myName;
© www.soinside.com 2019 - 2024. All rights reserved.