【问题标题】:Bad return type in lambda expression: Model1 cannot be converted to Model2lambda 表达式中的错误返回类型:模型 1 无法转换为模型 2
【发布时间】:2021-08-23 03:20:45
【问题描述】:

为什么会出现异常'ad return type in lambda expression: AuthenticatedUser cannot be convert to User'?如果 Optional 为空,我只想返回这个 AuthenticatedUser。

  User user = new User("d","d","d");
        return s -> {
            List<User> list = new ArrayList<>(Arrays.asList(TestData.BASIC_USER_ENTITY, TestData.ADMIN_USER_ENTITY));
            return new AuthenticatedUser(
                    list.stream()
                            .filter(u -> u.getUsername().equals(s))
                            .findAny()
                            .orElseGet(() -> new AuthenticatedUser(new User()))); // Bad return type in lambda expression: AuthenticatedUser cannot be converted to User
        };

【问题讨论】:

  • 我认为这是因为AuthenticatedUser 没有扩展User。它可能应该。
  • 不,它没有,它需要用户在构造函数中。
  • .orElseGet(() -&gt; new AuthenticatedUser(new User())) 更改为.orElseGet(() -&gt; new User())(或.orElseGet(User::new))。 orElseGet(...)-lambda 的返回类型必须匹配(即可分配给)Optional 的泛型类型(即User,而不是AuthenticatedUser)。
  • @Turing85 谢谢!

标签: java lambda


【解决方案1】:

如果我们仔细检查流上的操作,我们可以做出以下观察:

list.stream()  // produces a Stream<User>
    .filter(u -> u.getUsername().equals(s)) // still a Stream<User>
    .findAny() // produces an Optional<User>
    .orElseGet(() -> new AuthenticatedUser(new User())

传递给orElseGet(...) 的lambda 的返回类型必须与Optional 的泛型类型的赋值兼容。在我们的例子中,Optional 的泛型类型是User。因此,我们可以将代码重写为:

list.stream()
    .filter(u -> u.getUsername().equals(s))
    .findAny()
    .orElseGet(User::new)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-11
    • 2019-05-24
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    相关资源
    最近更新 更多