Java8 Lambda表达式

  在Java8之前,如果要往接口传参,总是传匿名内部类,如一个线程启动:

new Thread(new Runnable() {
	@Override
	public void run() {
		System.out.println("run");
	}
}).start();

 

  在Java8中出现了一种新特性Lambda 表达式,也可称为闭包,允许把函数作为一个方法的参数(函数作为参数传递进方法中),即函数式编程;

  函数式编程,在数学中,函数就是有输入量()、输出量return的一套计算方案,也就是“拿什么东西做什么事情”;相对而言,面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法,强调做什么,而不是以什么形式做;

  

  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表达式来代替,做的事情是:参数传递;执行方法体做事情:()->{};

  在Lambda标准格式()->{}的基础上,使用省略写法的规则为:

  1. 小括号内参数的类型可以省略;

  2. 如果小括号内有且仅有一个参数,则小括号可以省略;

  3. 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号;

原文地址:https://www.cnblogs.com/coder-zyc/p/10487133.html