在Session中使用lambda表达式

时间:2014-11-11 21:49:17

标签: java lambda javamail java-8

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

            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不是一个功能界面。

2 个答案:

答案 0 :(得分:3)

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

  1. 它没有一个lambda应该实现的抽象方法(实际上它没有任何抽象方法)
  2. (摘要,但仍然)不是接口
  3. 因此,lambdas只能用于具有一个抽象方法的接口。这样lambda知道它实现了哪个方法(知道它的签名,因此它知道所需参数的数量,它们的类型和类型或预期的返回值,如果有的话)。
    此外,我们并未说lambdas可以与任何SAM(单抽象方法 - 类似抽象类)类型一起使用,因为它只能用于SAM 接口(功能接口)。

答案 1 :(得分:3)

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