核心: lambda 表达式 是基于策略模式的一种简写,需要一个函数式接口。
策略模式:
应用场景:
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只 好使用多重的条件选择语句来实现。
函数式接口:
函数式接口就是接口中只有一个抽象类方法。但是它可以包含Object 类中的所有方法,可以对其进行重写
lambda 表达式理论:
/** * Lambda 表达式的基础语法: java 8中引入了一个新的操作符 “->” 该操作符称之为箭头操作符或者lambda 操作符 * 箭头操作符将lambda 表达式拆分成两部分: 左侧和右侧 左侧->右侧 * 左侧对应的是lambda:表达式的参数列表 * 右侧对应的是lambda: 表达式中所需执行的功能,即lambda体 * lambda 其实就是对接口的实现,代替了匿名内部类 * 在接口中 有抽象方法,左侧写的就是接口中抽象方法的参数列表,右侧写的就是抽象方法的实现的功能。 * 如果接口中 有多个接口方法,那该怎么办呢? ---》 函数式接口:即为接口中只有一个抽象方法的接口称之为函数式接口 *lambda 底层就是一个方法 * lambda 表达式表现形式 * 语法格式一: 无参数 无返回值: * ()->System.out.println("hello") * 语法格式二: 有一个参数 无返回值: * Consumer<String> com =(x) -> System.out.println(x); * com.accept("哈哈哈哈"); * 语法格式三: 如果只有一个参数 那么小括号可以省略不写 * Consumer<String> co2 =x -> System.out.println(x); * co2.accept("哈哈哈哈"); * 语法格式四: 有两个以上的参数,并且lambda体中有多条语句 并且有返回值 * 如果lambda体中有多条语句,就必须要用大括号 {} * Comparator<Integer> com= (x,y) ->{ * System.out.println("嗯嗯"); * return Integer.compare(x,y); * }; * Integer f= com.compare(15,60); * System.out.println(f); * 语法格式五:有两个以上的参数 若lambda体中只有一条语句,return和{}都可以省略不写 * Comparator<Integer> com =(x,y)->Integer.compare(x,y); * System.out.println(com.compare(7,2)); * 语法格式六:lambda表达式的参数列表的数据类型可以省略不写,因为jvm的编译器可以通过上下文推断出数据类型:即为“类型推断” * 如果要写数据类型,那么就要都要写 * 总结: * 左右遇一 括号省 :左侧只有一个参数时 小括号可以省,右侧lambda方法体只有一条语句时大括号可以省略 * 左侧推断类型省: 左侧有一个类型推断,就可以通过上下文推断出右侧方法体中的类型,右侧参数的类型就可以不写 * 注意: * lambda 表达式 需要“函数式接口”的支持: * 若接口中只有一个抽象方法的时候 我们就称之为函数式接口 可以使用注解:@FunctionalInterface 修饰 * 就可以检查一下这个接口是否函数式接口。 */
lambda 表达式 的应用实例
1: 无参数 无返回值
Runnable r1= ()->System.out.println("enen");// 对runnable 接口的实现 r1.run();// 直接调用接口的方法
2:有一个参数,无返回值
@Test public void test2(){ Consumer<String> com =(x) -> System.out.println(x);// lambda 就是对这个接口的一个实现 Consumer<String> co2 =x -> System.out.println(x); com.accept("哈哈哈哈");// 实现之后可以直接调用接口中的方法 }
3:有两个参数,有返回值
@Test public void test3(){ // 如果lambda体中有多条语句,就必须要用大括号 {} Comparator<Integer> com= (x,y) ->{ System.out.println("嗯嗯"); return Integer.compare(x,y); }; Integer f= com.compare(15,60); System.out.println(f); }
4:数据类型推断
/** * 数据类型推断 */ public void test5(){ // 比如: String[] str = {"1","3","44s"};// 这种写法 后边这部分就是根据上下文推断出来的,如果进行换行就会报错 /* 这种写法就会报错 因为推断不出来 String[] str2 = null; str2 = {"1","3","44s"};*/ List<String> list = new ArrayList<>();// 类型推断 show(new HashMap<>()); // 通过上下文进行类型推断 在jdk1.7就编译不过来 }