JavaSE学习笔记(7.Lamda表达式)

1.Lambda表达式

Lambda表达式是Java 8引入的新特性,详细JSR规范见:JSR-337(9.8 Functional Interfaces/15.13 Method Reference Expressions/15.27 Lambda Expressions)

1.1 Lambda表达式结构:

(参数列表)->{代码块}
  • 形参列表:a.参数列表可以为空
  •                   b.如果只要一个参数可以省略括号
  • 代码块:a.如果代码块只有一条语句,可以省略花括号
  •               b.如果代码块有返回值且只有一条语句,可以省略return关键词,返回这一条语句的值作为返回值!

 

2.函数式接口

2.1 定义:只声明一个抽象方法的接口(可以存在多个类方法和默认方法)

2.2 lambda表达式与函数式接口:

        lambda表达式的使用依赖与函数式接口,lambda表达式需要赋值给一个函数式接口,并通过函数式接口中的唯一抽象方法调用(抽象方法的入参、返回值必须与lambda表达式一致)!

2.3 @FunctionalInterface注解:

        Java 8为函数式接口提供了专门的注解,该注解没有任何功能作用,仅仅是告知编译器该接口为函数式接口,不满足函数式接口要求编译报错!

代码示例(包含与内部匿名类的比较):

@FunctionalInterface
interface TestFunction{
	int apply(int a);
}

public class Main {
	
	public static void main(String args[]) {
		/*Lambda表达式实现*/
		TestFunction testCase1 = (int q) -> {
				System.out.println("Lambda Test");
				return q;
			};
		
		System.out.println(testCase1.apply(100));
		
		/*匿名类对比实现*/
		TestFunction testCase2 = new TestFunction()
			{
				public int apply(int a)
				{
					System.out.println("Lambda Test");
					return a;
				}
			};
			
		System.out.println(testCase2.apply(100));	
	}
}

 

3.方法引用与构造器引用

       当lambda表达式代码块中只有一条语句的时候,可以使用方法引用和构造器引用来进一步简化,但是个人感觉可能这种写法相对比较晦涩(这里面就不具体提供代码示例了),详细说明见JSR-337-15.13!

 

4.Lambda表达式与匿名内部类关系

相同点:

  1. Lambda表达式是匿名内部类的一种简化,可以替代部分匿名内部类
  2. Lambda表达式与匿名内部类一样,都遵循"effectively final"规则,详细描述见《JavaSE学习笔记(6.Java的内部类)》

不同点:

Lambda表达式的使用场景,仅仅是生成一个函数式接口实现类的过程;但是匿名内部类的使用场景,是继承父类(基础类、抽象类、接口),并生成一个匿名子类的过程!所以匿名内部类的使用场景更多,类内可以实现多个抽象方法,并可以直接访问接口中的默认方法!Lambda表达式仅仅是匿名内部类的一个使用场景!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章