【问题标题】:How can rewrite about this java lambda expression? [duplicate]如何重写这个 java lambda 表达式? [复制]
【发布时间】:2021-11-27 12:56:54
【问题描述】:

目前我正在学习 Springboot。

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        Collection<GrantedAuthority> collection = new ArrayList<GrantedAuthority>();
        collection.add(()-> user.getRole().getKey());
        return collection;
    }

在这段代码中

collection.add(()-> user.getRole().getKey());

我知道这是 lambda 表达式,但我没有得到原始代码。 这不是我的代码。 你能告诉我原始代码吗?

【问题讨论】:

  • 我不知道你所说的“原始代码”是什么意思,但由于collection.add 期待GrantedAuthority,而GrantedAuthority 有一个抽象方法,lambda 定义的函数是推断为GrantedAuthority::getAuthority。即您添加到该集合的东西是一个授予的权限,它总是返回user 的角色键,其中user 大概是这个类的一个字段(因为你还没有提供定义)

标签: java spring-boot


【解决方案1】:

有一些类型的 lambda 表达式:

  1. (int x, int y) -> { 返回 x + y; }
  2. x -> x * x
  3. ( ) -> x

所以,你的案子是第三个。当您没有参数作为方法参数并返回值时使用它。在您的示例中,它只返回 user.getRole().getKey()); 的值并将其添加到 Collection&lt;GrantedAuthority&gt;

【讨论】:

  • 我不确定我是否同意说有 3 种类型,或者充其量我认为这不是一种有用的思考方式。 x -&gt; { return x * x; } 怎么样?更准确地说,LHS 有几种形式(带/不带括号,带/不带类型),而 RHS 有多种形式(表达式/块)。我做了 8 种可能的“类型”,对吧?
  • 好吧,我不是说3种,我更正了
【解决方案2】:

代码很难理解,因为集合应该是GrantedAuthority 对象的集合。 GrantedAuthority 是带有 getAuthority() 函数的单一方法 interface - https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/core/GrantedAuthority.html#getAuthority()

所以代码在这里尝试做的是创建一个带有GrantedAuthority 的单个元素集合,其getAuthority 方法返回user.getRole().getKey() 的值——无论在这个上下文中发生什么。

您可能会发现这里有一个一次性类更容易想到:

GrantedAuthority theOneAuthority = new GrantedAuthority() {
   String getAuthority() {
      return user.getRole().getKey();
   }
}
return List.of(theOneAuthority); // a single entry list

然而,要理解上述内容,您需要了解匿名内部类的概念 - 换句话说,一种临时类型,其工作是子类化接口或其他类以执行特定方法希望我们执行的操作做。

在这种情况下,lambda 是更好的选择。

// as there's only one method, taking 0 parameters and returning string
// then this 0 parameter string-returning lambda can BE a `GrantedAuthority`
GrantedAuthority authFromLambda = () -> user.getRole().getKey();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    相关资源
    最近更新 更多