我正在编写一个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不是一个功能界面。
答案 0 :(得分:3)
不,你不能在这里使用lambda。 Lambdas只能用作功能接口实现的表示(只有一个抽象方法的接口),但Authenticator
不是功能接口,因为
因此,lambdas只能用于具有一个抽象方法的接口。这样lambda知道它实现了哪个方法(知道它的签名,因此它知道所需参数的数量,它们的类型和类型或预期的返回值,如果有的话)。
此外,我们并未说lambdas可以与任何SAM(单抽象方法 - 类似抽象类)类型一起使用,因为它只能用于SAM 接口(功能接口)。
答案 1 :(得分:3)
除了解释为什么你不能在这里使用lambdas之外,请注意你可能don't even need to use an Authenticator。