在Session中使用lambda表达式

我正在编写一个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不是一个function界面。

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

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

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

除了解释为什么你不能在这里使用lambdas之外,请注意你甚至根本不需要使用Authenticator 。