黑马程序员技术交流社区

标题: 【郑州校区】Java 8新特性之Lambda表达式入门 [打印本页]

作者: 我是楠楠    时间: 2017-11-28 09:31
标题: 【郑州校区】Java 8新特性之Lambda表达式入门
【郑州校区】Java 8新特性之Lambda表达式入门

文/传智播客郑州校区就业服务部

Lambda表达式是Java 8 的重要更新,也是一个被广大开发者期待已久的新特性。Lambda表达式支持代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例。

那么Lambda表达式到底是如何书写的呢,我们先来看一下它的语法格式。其实它由三部分组成。

l 形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
l 箭头(->)。必须通过英文中画线和大于符号组成。

l 代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么这条语句就不要用花括号表示语句结束。Lambda表达式只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值。

下面我们举例说明Lambda表达式的几种简化写法。               

[AppleScript] 纯文本查看 复制代码
package com.itheima;
public class Demo {
        // 调用该方法需要Eatable对象
        public void eat(Eatable e) {
                System.out.println(e);
                e.taste();
        }
        // 调用该方法需要Flyable对象
        public void drive(Flyable f) {
                System.out.println("我正在驾驶:" + f);
                f.fly("【碧空如洗的晴日】");
        }
        // 调用该方法需要Addable对象
        public void test(Addable add) {
                System.out.println("5与3的和为:" + add.add(5, 3));
        }
        public static void main(String[] args) {
                Demo demo= new Demo();
                // Lambda表达式的代码块只有一条语句,可以省略花括号。
                demo.eat(() -> System.out.println("苹果的味道不错!"));
                // Lambda表达式的形参列表只有一个形参,省略圆括号
                demo.drive(weather -> {
                        System.out.println("今天天气是:" + weather);
                        System.out.println("直升机飞行平稳");
                });
                // Lambda表达式的代码块只有一条语句,省略花括号
                // 代码块中只有一条语句,即使该表达式需要返回值,也可以省略return关键字。
                demo.test((a, b) -> a + b);
        }

[AppleScript] 纯文本查看 复制代码
interface Eatable {
        void taste();
}
interface Flyable {
        void fly(String weather);
}
interface Addable {
        int add(int a, int b);
}
上面程序中的第一段粗体字代码使用Lambda表达式相当于不带形参的匿名方法,由于该Lambda表达式的代码只有一行代码,因此可以省略代码块的花括号;第二段粗体字代码使用Lambda表达式相当于只带一个形参的匿名方法,由于该Lambda表达式的形参列表只有一个形参,因此省略了形参列表的圆括号;第三段粗体字代码的Lambda表达式的代码块中只有一行语句,这行语句的返回值将作为该代码块的返回值。

我们发现,以上三段粗体字代码调用的方法分别需要传入Eatable类型参数、Flyable类型参数、Addable参数,但事实上我们传入的仅仅是Lambda表达式,但上面的程序可以正常编译、运行,这说明Lambda表达式实际上将会被当成一个“任意类型”的对象,到底需要当成何种类型的对象,这取决于运行环境的需要,后面我们再详细介绍Lambda表达式被当成何种对象。



传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出


作者: 我是媛媛    时间: 2017-11-28 09:54
来看看 Java 8新特性
作者: 我是媛媛    时间: 2017-11-28 10:03
来看看新特性都有哪些
作者: 小小的人儿    时间: 2017-11-28 10:05
Lambda表达式




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2