Java8新特性(Lambda表达式)
in Java with 5 comment

Java8新特性(Lambda表达式)

in Java with 5 comment

Lambda 表达式是在Java 8中引入的,并且成为了Java 8最大的特点。它使得功能性编程变得非常便利,极大地简化了开发工作。

语法

一个Lambda表达式具有下面这样的语法特征。它由三个部分组成:第一部分为一个括号内用逗号分隔的参数列表,参数即函数式接口里面方法的参数;第二部分为一个箭头符号:->;第三部分为方法体,可以是表达式和代码块。语法如下:

parameter -> expression body

下面列举了Lambda表达式的几个最重要的特征:

语言的设计者们思考了很多如何让现有的功能和lambda表达式友好兼容。于是就有了函数接口这个概念。函数接口是一种只有一个方法的接口,函数接口可以隐式地转换成 Lambda 表达式。

函数式接口的重要属性是:我们能够使用 Lambda 实例化它们,Lambda 表达式让你能够将函数作为方法参数,或者将代码作为数据对待。Lambda 表达式的引入给开发者带来了不少优点:在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差,Lambda 表达式的应用则使代码变得更加紧凑,可读性增强;Lambda 表达式使并行操作大集合变得很方便,可以充分发挥多核 CPU 的优势,更易于为多核处理器编写代码。引用自IBM - Java 8 新特性概述

Lambda表达式的例子

package cn.eunji.watermark;

/**
 * @Class Java8Test
 * @Description TODO Java8新特新Lambda表达式
 * @Author Aquan
 * @Date 2018.11.22 15:57
 * @Version 1.0
 **/
public class Java8Test {

    public static void main(String[] args) {

        Java8Test tester = new Java8Test();

        // 带有类型声明的表达式
        MathOperation addition = (int a, int b) -> a + b;

        // 没有类型声明的表达式
        MathOperation subtraction = (a, b) -> a - b;

        // 带有大括号、带有返回语句的表达式
        MathOperation multiplication = (int a, int b) -> { return a * b; };

        // 没有大括号和return语句的表达式
        MathOperation division = (int a, int b) -> a / b;

        // 输出结果
        System.out.println("10 + 5 = "+tester.operate(10,5,addition));
        System.out.println("10 - 5 = "+tester.operate(10,5,subtraction));
        System.out.println("10 x 5 = "+tester.operate(10,5,multiplication));
        System.out.println("10 / 5 = "+tester.operate(10,5,division));

        // 没有括号的表达式
        GreetingService greetService1 = message -> System.out.println("Hello " + message);

        // 有括号的表达式
        GreetingService greetService2 = (message) -> System.out.println("Hello " + message);

        // 调用sayMessage方法输出结果
        greetService1.sayMessage("Shiyanlou");
        greetService2.sayMessage("Classmate");

    }


    // 下面是定义的一些接口和方法

    interface MathOperation {
        int operation(int a, int b);
    }

    interface GreetingService {
        void sayMessage(String message);

    }

    private int operate(int a, int b, MathOperation mathOperation) {
        return mathOperation.operation(a, b);
    }

}

运行结果:

...
10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Shiyanlou
Hello Classmate

Process finished with exit code 0

需要注意的是:

作用域

public class NewFeaturesTester {
    final static String salutation = "Hello "; //正确,不可再次赋值
    //static String salutation = "Hello "; //正确,可再次赋值
    //String salutation = "Hello "; //报错
    //final String salutation = "Hello "; //报错

    public static void main(String args[]){
        //final salutation = "Hello "; //正确,不可再次赋值
        //String salutation = "Hello "; //正确,隐性为 final , 不可再次赋值

        // salution = "welcome to "  
        GreetingService greetService1 = message -> 
        System.out.println(salutation + message);
        greetService1.sayMessage("Shiyanlou");
    }

    interface GreetingService {
       void sayMessage(String message);
    }
}

运行结果:

Hello Classmate

注意以下几点:

方法引用

方法引用提供了一个很有用的语义来直接访问类或者实例的已经存在的方法或者构造方法。

方法引用可以通过方法的名字来引用其本身。方法引用是通过::符号(双冒号)来描述的。

它可以用来引用下列类型的方法:

更多对于方法引用的介绍,可以参考这一篇博文——java8 - 方法引用(method referrance)

栗子:

import java.util.List;
import java.util.ArrayList;

public class NewFeaturesTester {

    public static void main(String args[]){
        List names = new ArrayList();

        names.add("Peter");
        names.add("Linda");
        names.add("Smith");
        names.add("Zack");
        names.add("Bob");

        //     通过System.out::println引用了输出的方法
        names.forEach(System.out::println);
    }
}

运行结果:

Peter
Linda
Smith
Zack
Bob
5评论
  • 厉害

  • mshan

    Nice

  • 低调小熊猫

    上柱香献花.png

  • 20181122

    可以,很强

    • Aquan 博主

      @20181122 嘻嘻一起学习赞一个.png