【问题标题】:Using a lambda expression in Session在 Session 中使用 lambda 表达式
【发布时间】:2014-11-12 07:23:48
【问题描述】:

我正在编写一个 Javafx 应用程序,其中使用 JavaMail 发送电子邮件。创建新会话时,我使用语法。

            Session session = Session.getInstance(props, 
            //Use labmda expression?
            new javax.mail.Authenticator() {

                protected javax.mail.PasswordAuthentication getPasswordAuthentication(){
                return new javax.mail.PasswordAuthentication(userName, password);

                }
            }
        );

我想知道是否可以使用 lambda 表达式来简化它,例如

() -> return new java.mail.PasswordAuthentiaction(userName, password)

但是每当我使用它时,它都会抛出不兼容的类型,并说 Authenticator 不是功能接口。

【问题讨论】:

  • 您可能需要包装 Authenticator 并为除一个之外的方法实现默认实现。然后您将拥有一个功能界面,您可以将其用于您的目的
  • "但每当我使用它时,它会抛出不兼容的类型,并说 Authenticator 不是功能接口",如果 Authenticator 不是 functional interface(注意:abstract只有一个抽象方法的类不被认为是功能性的接口)那么不,你不能使用 lambda 来实现它的方法。
  • 我也不相信你的语法是正确的。您需要在您的退货声明周围加上括号。
  • 就语法而言,可以通过删除return 来避免括号。但是,是的,它只能分配给功能接口,AFAIK。

标签: java lambda jakarta-mail java-8


【解决方案1】:

不,你不能在这里使用 lambda。 Lambdas 只能用作功能接口(只有一个抽象方法的接口)的实现表示,但Authenticator 不是功能接口,因为

  1. 它没有一个 lambda 应该实现的抽象方法(实际上它没有任何抽象方法)
  2. 它是(抽象,但仍然是)而不是接口

同样,lambda 只能用于具有一种抽象方法的接口。这样 lambda 就知道它实现了哪个方法(知道它的签名,因此它知道所需参数的数量、它们的类型和类型或预期的返回值(如果有)。
此外,我们并不是说 lambda 可以与任何 SAM(单一抽象方法 - 类似抽象类)类型一起使用,因为它只能与 SAM 接口(功能接口)一起使用。

【讨论】:

    【解决方案2】:

    除了解释为什么你不能在这里使用 lambdas 之外,请注意你可能根本没有don't even need to use an Authenticator

    【讨论】:

    • 很有趣,但Transport.send(message, username, password) 签名在哪里?
    • 当然是JavaMail javadocs。这不是您查找 API 文档的第一个地方吗?
    • 明白了!错过了关于这个主题的 JavaMail 部分。我正在寻找通常的 J2E 传输
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多