Lambda 是一个匿名函数, Lambda 表达式是一段可以传递的代码(将代码像数据一样进行传递)。
Lambda表达式其本质是函数式接口(只有一个抽象方法)的实例。
它是可传递的匿名函数的一种形式:它没有名称,但它有参数列表,函数主体,返回类型,可能还有一个可以抛出的异常列表。
Lambda 表达式基础语法:
Lambda 表达式:是Java 8 语言引入的一种新的语法,它是一个代码块,可以作为函数接口的实例。Java引入了一个新的操作符“->”, 该操作符被称为 Lambda 操作符或箭头操作符。箭头操作符将 Lambda 分成了两个部分:
①左侧:是 Lambda 表达式的参数列表。
②右侧:是 Lambda 表达式的代码块(函数体),是函数式接口中抽象方法的方法体。
Lambda 表达式的语法格式:
-
格式一:无参数,无返回值的用法
无参数,无返回值的用法 示例:() -> System.out.println(“我是一个线程的Lambda版本”);
public void test1() {Runnable r = new Runnable() {@Overridepublic void run() {System.out.println("我是一个线程");}};r.run();Runnable r1 = () -> System.out.println("我是一个线程的Lambda版本");r1.run();}
- 格式二:有一个参数,无返回值的用法: (x) -> System.out.println(x); 或者 x -> System.out.println(x); 一个参数,可以省略参数的小括号。
public void test2(){String message = "消费者Consumer函数式接口,有一个输入参数,无返回值";Consumer<String> con = (x) -> System.out.println(x);con.accept(message);}
- 格式三:有两个参数,有返回值的:(x, y) -> x + y
public void test3() {//作为函数接口的实例BinaryOperator<Integer> binary = (x, y) -> x + y;System.out.println(binary.apply(1, 2)); // 3}
- 格式四:剩下的多个参数,就不在继续介绍了,按照上面的推测,就可以了,上面的例子,函数体中,都是一行语句,最后一个语法,介绍下,Lambda 表达式中,多行语句,分别在无返回值和有返回值的抽象类中的用法
public void test4() {// 无返回值lambda函数体中用法Runnable r1 = () -> {System.out.println("Lambda演示1");System.out.println("Lambda演示2");System.out.println("Lambda演示3");};r1.run();// 有返回值lambda函数体中用法BinaryOperator<Integer> binary = (x, y) -> {int a = x * 2;int b = y + 2;return a + b;};System.out.println(binary.apply(1, 2));// 6}
- 其他的Lambda 表达式语法:
1,Lambda 表达式,若只需要一个参数时,参数的小括号可以省略。
2,当 Lambda 函数体只有一条语句时,return 与大括号若有,都可以省略。
3,Lambda 表达式参数的数据类型通常可以省略,因为大多可由编译器推断得出,称为“类型推断”。
public void test5() {//直接使用Lambda 表达式,“类型推断”Integer sum = Arrays.asList(1, 3, 5, 2, 4).stream().reduce(0, (x, y) -> x + y);System.out.println("sum = "+ sum); //打印“sum = 15”}
可以看到,在Lambda 表达式中的参数列表,可以不用写参数的类型,称为“类型推断”。这与 java7中 new ArrayList<>(); 类似,<>棱形操作符不需要指定泛型类型,可根据上下文做类型的推断。
参考文档
Java Lambda 表达式详解