如何在流 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 ...)

您的情况有两种选择:

  1. 因为你的 map() returns Optional<List<User>>,你可以更新 findXyz() 到 return 一样

  2. 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