lambda表达式 拉姆达
学习这个之前,需要明确
有一种接口叫做函数式接口,只允许接口里面只有一个函数
可以使用
@FunctionalInterface进行注解
如果这个接口里面定义了两个方法,就会报错,当然,这种接口主要是针对lambda表达式使用
函数式接口允许:
1.定义默认方法
2.定义静态方法
3.定义Object里的public方法
明确了这一点,然后再去学习lambda表达式,下面这个是自己在学习发送邮件的时候,看到的,接口需要自己重新实现prepare方法,因为是一个void方法,传入参数类型是可以不指定的,所以,就可以使用lambda表达式进行接口实例化。
MimeMessagePreparator messagePreparator = mimeMessage -> {
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
messageHelper.setFrom(sender,senderName);
messageHelper.setTo(receiver);
messageHelper.setSubject(subject);
messageHelper.setText(message);
};
MimeMessagePreparator mimeMessagePreparator = new MimeMessagePreparator() {
@Override
public void prepare(MimeMessage mimeMessage) throws Exception {
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
messageHelper.setFrom(sender,senderName);
messageHelper.setTo(receiver);
messageHelper.setSubject(subject);
messageHelper.setText(message);
}
};
lambda表达式学会以后,确实发现是比较简洁的写法,因为对于接口的实例化变得更加的简洁,而且,最重要的是,其他的问题不大,对于comparable接口的实例化就会更加的清晰
刚写的例子,会少好多行代码
Collections.sort(a,new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
return -1;
}
});
Collections.sort(a, (o1,o2) -> {return -1;});
然后,只是需要注意一点的是,对于直接实例化,是可以指定
package com.gsy;
public class EmailProperty {
public static void main(String args[]) {
new EmailProperty();
}
interface qqq{
int a(int a);
}
interface ppp{
int a(int b);
}
class test{
int a;
int b;
int testa(int a,int b,qqq qqq){
return 1;
}
int testa(int a,int b,ppp ppp){
return 1;
}
}
public EmailProperty() {
test aaa = new test();
aaa.a = 1;
aaa.b = 2;
aaa.testa(1, 2,new ppp() {
@Override
public int a(int b) {
// TODO Auto-generated method stub
return 0;
}
});
aaa.testa(1, 2, (qqq) i -> {return -1;});
}
}
by the way 关于指定lambda表达式实例化是Stack Overflow上外国友人回答的- -,百度百度不到- -