JAVA8引入的特性,最近看亚马逊的云服务,发现他们要用lambda,也不知道是不是一回事。
一、为什么引入Lambda表达式
匿名内部类有个问题是:如果匿名内部类的结构简单、仅有一个方法时,代码会显得很冗余、不明确。例如当按键被点击时,触发一个行为Action,代码示例如下:
Button button = new Button();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
System.out.println("hello world");
}
});
而Lambda表达式就是为了压缩这种代码场景。
button.addActionListener( (ActionEvent event) -> System.out.println("hello world") );当方法只有一个参数时,可以将 (ActionEvent event)改写为 event
二、Lambda表达式的举例
1.详细示例:筛选花名册中符合某一条件的人群
//CheckPerson 接口用于表示这种规则,Person类就是对人的封装,有年龄、打印等,不再列举。
interface CheckPerson {
boolean test(Person p);
}
//用于打印符合CheckPerson标准的人群的方法
public static void printPersons(
List roster, CheckPerson tester) {
for (Person p : roster) {
if (tester.test(p)) {
p.printPerson();
}
}
}
a)用匿名内部类来实现
printPersons(
roster,
new CheckPerson() {
public boolean test(Person p) {
return p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25;
}
}
);
b)用Lambda表达式来实现
printPersons(roster, p -> p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25);
三、Lambda表达式语法构成:
1.在括号内一组以逗号分隔的参数列表:(Person p)来表示,多参数(A a, B
b, C c)
a)可以省略数据类型:(p)表示
b)当只有一个形参时,可以省略括号:p表示
2.箭头: ->
3.body(主体,类似方法体)由单独的表达式或者statement block(声明块)组成:
a)单独的表达式(single expression)(expression是指由variables, operators, and method invocations,(变量、操作符、方法调用) 组成)
p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25
b)statement block (statment就是expression以分号结尾,block就是一堆的statement)必须用大括号{}封闭:
{return p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25; }
我把a)的表达式转换为 b)的声明(statement),b)。statement block就和方法体是一回事了。如果用表达式(expression)编译器会自动检测返回类型。
其他部分实际多态等和方法是一样