[Java] Java8 新特性之 Lambda 表达式

一、Lambda 表达式介绍

Lambda 表达式是 Java8 发布最重要的一个特性,它允许将一个函数作为一个函数的参数,它的语法如下:

( parameters ) -> expression
或
(parameters ) ->{ statements; }

常见的几个例子:

// 1. 不需要参数,返回值为 5  
() -> 5  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)

可见 Lambda 表达式是可以不声明参数的类型的,可以选择前面参数的括号和后面的大括号要不要的,另外返回值类型也是可选的。下面我们来看看常见的 Lambda 表达式示例。

 

二、Lambda 表达式示例

1、用 Lambda 表达式实现 Runnable

        //原来的实现方式
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.print("HelloWorld!");
            }
        }).start();

        //Lambda表达式实现
        new Thread(() -> {
            System.out.print("HelloWorld!");
        }).start();

2、用 Lambda 表达式实现事件处理

        //原实现方式
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getApplicationContext(), "helloWorld!", Toast.LENGTH_LONG).show();
            }
        });
        
        //Lambda实现
        btn.setOnClickListener((e) -> {
            Toast.makeText(getApplicationContext(), "helloWorld!", Toast.LENGTH_LONG).show();
        });

以上两个例子可见 Lambda 表达式可用来取代 Java 的匿名内部类,当然它们还是有一定区别的,比如匿名类的 this 关键字指向的就是这个匿名类,而 Lambda 表达式的 this 关键字是指向包围这个 Lambda 表达式的类,同时 Lambda 表达式在编译时实则是将其编译成私有方法。

3、用 Lambda 表达式进行迭代

        //原始实现
        List<Integer> numbers = Arrays.asList(100, 200, 300, 400, 500);
        for (Integer number : numbers) {
            System.out.println(number);
        }

        //使用Lambda表达式
        numbers.forEach((n) -> System.out.println(n));
        //Java8的方法引用实现
        numbers.forEach(System.out::println);

 

另外,Java8 提供了函数式编程非常方便的一个包:java.util.function,利用这个包可非常方便使用函数式编程,大家可以看官方文档:https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html ,后续我也将出一篇文章来介绍这个包如何使用函数式编程,让大家感受一下函数式编程的奇妙。

三、在 Java8 以下环境使用 Lambda 表达式

在我们开发中往往会遇到开发环境还未支持 Java8 的情况,比如笔者在 SDK 开发中为了兼容性以及对 SDK 使用者的方便则会通过一定方式将 Lambda 表达式转换为 Java6 或 7 可编译的代码。我在项目中用到了 retrolambda,在 Android 开发中可用其 Gradle 插件(https://github.com/evant/gradle-retrolambda),使用方式见其 Readme.md,这样我们就可以将 Java8 代码转换为 Java6 或 7 可编译的代码了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注