在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接口,因为
- 它没有lambda应该实现的一个抽象方法(实际上它没有任何抽象方法)
- 它是类 (抽象,但仍然是类 )而不是接口 。
因此,lambdas只能用于具有一个抽象方法的接口。 这样lambda知道它实现了哪个方法(知道它的签名,因此它知道所需参数的数量,它们的类型和类型或预期的返回值,如果有的话)。
此外,我们并未说lambdas可以与任何SAM(单抽象方法 – 类似抽象类)类型一起使用,因为它只能用于SAM 接口 (function接口)。
除了解释为什么你不能在这里使用lambdas之外,请注意你甚至根本不需要使用Authenticator 。