如何在流 API 中正确使用 .map 和 .orElseGet 的组合?
How to properly use the combination of .map and .orElseGet within stream API?
我有以下代码:
private List<User> findUsers(...) {
...
return usersData.stream() //userData is another list of objects
.findFirst()
.map(this::getCode)
.map(code-> {
if (...) {
Optional<AnotherObject> anotherObject = getAnotherObject();
return anotherObject.map(userService::getUsersFromAnotherObject) // getUsersFromAnotherObject returns List<User> but the whole line returns Optional of List<User>
} else {
...
return null;
}
}).orElseGet(() -> findXYZ(...));
}
不编译并说:
“lambda 表达式中的错误 return 类型:List<User>
无法转换为 Optional<List<User>>
”
即使 findXYZ 和所有其他 if/else 语句 return 实际上键入 List.
任何人都可以向我解释一下代码有什么问题吗?
编辑:
抱歉,我注意到其中一个 if 语句实际上是 returning List
的 Optional
如果有人感兴趣,我解决了它只需将第一个“if”编辑为:
return userService.getUsersFromAnotherObject(anotherObject.orElse(null));
(已编辑)
在您的情况下,两者的 return 应该匹配,因为那是 orElseGet()
的用途 - 给出相同类型的替代值。
.map(code -> return ...)
.orElseGet(() -> return ...)
您的情况有两种选择:
因为你的 map() returns Optional<List<User>>
,你可以更新 findXyz()
到 return 一样
将 map()
的代码更新为如下所示(return List<User>
没有 Optional
换行,然后您可以保留 findXyz()
是原创的)。
usersData.stream().findFirst()
.map(this::getCode)
.map(code-> {
if (...) {
Optional<AnotherObject> anotherObject = getAnotherObject();
Optional<List<User>> optUserList = anotherObject.map(userService::getUsersFromAnotherObject)
return optUserList.isPresent() ? optUserList.get() : null;
} else {
...
return null;
}
}).orElseGet(() -> findXYZ(...));`
在orElseGet()
后面加一个.get()
就可以了
private List<User> findUsers(...)
{
...
return usersData.stream() //userData is another list of objects
.findFirst()
.map(this::getCode)
.map(code-> {
if (...) {
return ...
}
else {
return ...;
}
})
.orElseGet(() -> findXYZ(...))
.get();
}
因为.orelse
得到Optional
的return对象class
我有以下代码:
private List<User> findUsers(...) {
...
return usersData.stream() //userData is another list of objects
.findFirst()
.map(this::getCode)
.map(code-> {
if (...) {
Optional<AnotherObject> anotherObject = getAnotherObject();
return anotherObject.map(userService::getUsersFromAnotherObject) // getUsersFromAnotherObject returns List<User> but the whole line returns Optional of List<User>
} else {
...
return null;
}
}).orElseGet(() -> findXYZ(...));
}
不编译并说:
“lambda 表达式中的错误 return 类型:List<User>
无法转换为 Optional<List<User>>
”
即使 findXYZ 和所有其他 if/else 语句 return 实际上键入 List.
任何人都可以向我解释一下代码有什么问题吗?
编辑: 抱歉,我注意到其中一个 if 语句实际上是 returning List
的 Optional如果有人感兴趣,我解决了它只需将第一个“if”编辑为:
return userService.getUsersFromAnotherObject(anotherObject.orElse(null));
(已编辑)
在您的情况下,两者的 return 应该匹配,因为那是 orElseGet()
的用途 - 给出相同类型的替代值。
.map(code -> return ...)
.orElseGet(() -> return ...)
您的情况有两种选择:
因为你的 map() returns
Optional<List<User>>
,你可以更新findXyz()
到 return 一样将
map()
的代码更新为如下所示(returnList<User>
没有Optional
换行,然后您可以保留findXyz()
是原创的)。usersData.stream().findFirst() .map(this::getCode) .map(code-> { if (...) { Optional<AnotherObject> anotherObject = getAnotherObject(); Optional<List<User>> optUserList = anotherObject.map(userService::getUsersFromAnotherObject) return optUserList.isPresent() ? optUserList.get() : null; } else { ... return null; } }).orElseGet(() -> findXYZ(...));`
在orElseGet()
.get()
就可以了
private List<User> findUsers(...)
{
...
return usersData.stream() //userData is another list of objects
.findFirst()
.map(this::getCode)
.map(code-> {
if (...) {
return ...
}
else {
return ...;
}
})
.orElseGet(() -> findXYZ(...))
.get();
}
因为.orelse
得到Optional
的return对象class