码迷,mamicode.com
首页 > 编程语言 > 详细

Java8 Labmbda表达式

时间:2015-02-20 18:38:57      阅读:1153      评论:0      收藏:0      [点我收藏+]

标签:lambda   java8   新特性   

翻译自JAVA官网http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

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<Person> 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)必须用大括号{}封闭:

<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>

我把a)的表达式转换为 b)的声明(statement),b)。statement block就和方法体是一回事了。如果用表达式(expression)编译器会自动检测返回类型。

其他部分实际多态等和方法是一样






Java8 Labmbda表达式

标签:lambda   java8   新特性   

原文地址:http://blog.csdn.net/zhjali123/article/details/43883203

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!