在Java8之前,如果要往接口传参,总是传匿名内部类,如一个线程启动:
new Thread(new Runnable() { @Override public void run() { System.out.println("run"); } }).start();
在Java8中出现了一种新特性Lambda 表达式,也可称为闭包,允许把函数作为一个方法的参数(函数作为参数传递进方法中),即函数式编程;
函数式编程,
Lambda语法格式:
(parameters) -> expression 或 (parameters) ->{ statements; }
以下是Lambda表达式的重要特征:
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值;
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号;
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号;
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值;
使用例程如下:
public class LambdaTest { public static void main(String args[]){ // 类型声明 MathOperation addition = (int a, int b) -> a + b; // 不用类型声明 MathOperation subtraction = (a, b) -> a - b; // 大括号中的返回语句 MathOperation multiplication = (int a, int b) -> { return a * b; }; // 没有大括号及返回语句 MathOperation division = (int a, int b) -> a / b; System.out.println("10 + 5 = " + operate(10, 5, addition)); System.out.println("10 - 5 = " + operate(10, 5, subtraction)); System.out.println("10 x 5 = " + operate(10, 5, multiplication)); System.out.println("10 / 5 = " + operate(10, 5, division)); // 不用括号 GreetingService greetService1 = message -> System.out.println("Hello " + message); // 用括号 GreetingService greetService2 = (message) -> System.out.println("Hello " + message); greetService1.sayMessage("Java"); greetService2.sayMessage("C++"); } interface MathOperation { int operation(int a, int b); } interface GreetingService { void sayMessage(String message); } private static 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 Java Hello C++
在Lambda标准格式()->{}的基础上,使用省略写法的规则为:
-
小括号内参数的类型可以省略;
-
如果小括号内有且仅有一个参数,则小括号可以省略;
-
如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号;