Lambda表达式是jdk1.8的一个新特性,在之前的java中我们无法将函数作为参数传递给方法,,也无法声明一个返回函数的方法。所以Lambda就诞生了。
在java的GUI之中就有许多的匿名内部类的表达式:
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("删除")
}
});
而在jdk1.8中我们可以这样写:
button.addActionListener(event->{
System.out.println("删除");
});
我们可以在箭头的后面加一对花括号,在花括号里添加我们所需要的内容:
button.addActionListener(event->{
System.out.println("删除");
System.out.println("hellow");
System.out.println("world");
});
**总之我们可以把Lambada总结为:(param1,param2)->{
内容…
}
**为了更加了解函数性接口,我在下面举一个List列子方便我们去理解:
public class Test{
public static void main(String args[]){
List<Integer> list=ArrayList.asList(1,2,3,4,5,6,7,8,9);
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
System.out.println("__________________")
for(Integer i:list){
System.out.println(i);
}
System.out.println("__________________")
list.forEach(new Consumer<Integer>()){
@Override
public void accept(Integer t){
System.out.println(t)
}
}
}
}
这里有三种方法来实现对list集合的遍历而比较独特并且看起比较困难的第三种方法,包含了Consumer接口,它是一种函数式接口,该接口中只有一个accept方法,而我们的线程常见的就有一个runnable接口,该接口中也是一种函数式接口,只有run方法。
总结关于函数式接口有一下三点:
1、如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口。
2、如果我们在某一个接口上申明了FunctionalInterface注解,那么编译器就会按照函数式接口来要求该接口。
3、如果一个接口只有一个抽象方法,但是我们并没有将他声明为FunctionalInterface注解,那么编译器依旧会将该接口看作是函数式接口。