我有一个字符串数组:
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()))
// from this point onwards it's your own code
.map(Object::toString).collect(joining(" "));
myName = myName.substring(myName.lastIndexOf("/") + 1);
return myName;
}
您可以将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 tagName toString representation
.collect(Collectors.joining(" ")); // convert them to string
然后执行子字符串操作
myName = myName.substring(myName.lastIndexOf("/") + 1);
return myName;