翻译自JAVA官网http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
JAVA8引入的特性,最近看亚马逊的云服务,发现他们要用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
1.详细示例:筛选花名册中符合某一条件的人群
//CheckPerson 接口用于表示这种规则,Person类就是对人的封装,有年龄、打印等,不再列举。
interface CheckPerson { boolean test(Person p); }
//用于打印符合CheckPerson标准的人群的方法
public static void printPersons( List<Person> roster, CheckPerson tester) { for (Person p : roster) { if (tester.test(p)) { p.printPerson(); } } }
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);
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)必须用大括号{}封闭:
<span style="background-color: rgb(255, 255, 51);">{</span>return p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25<span style="background-color: rgb(255, 255, 51);">;</span> <span style="background-color: rgb(255, 255, 51);">}</span>
其他部分实际多态等和方法是一样
原文地址:http://blog.csdn.net/zhjali123/article/details/43883203