java8新特性,速度快,代码少,便于并行,强大的streamAPI,最大化减少空指针异常,本篇博客主要总结一下兰姆达表达式.
Lambda是一个匿名函数,我们可以把Lambda表达式理解为一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁/更灵活的代码.作为一种更紧凑的代码风格,使java的语言表达能力得到了提升.
Lambda表达式包含三部分:
1、左边:指定了Lambda表达式需要的所有参数
2、一个箭头符号:->
3、右边指定了Lambda方法体,即Lambda表达式要执行的功能,可以是表达式和代码块。
语法格式一:无参数,无返回值
Runnable r1 = () -> System.out.println("Hello");
语法格式二:有一个参数,并且无返回值
Consumer fun = x)->System.out.println(“Hello”);
语法格式三:若只有一个参数,()可以省略不写
Consumer fun = x->System.out.println(“Hello Lambda!”);
语法格式四:有两个以上的参数,有返回值, 并且lambda体中有多条语句
BinaryOperator bo = (x,y) -> {System.out.println("实现函数接口的方法!";
return x + y;)}
语法格式五:若lambda体中只有一条语句,return和{}都可以省略不写
BinaryOperator bo =(x,y) -> x + y;
语法格式六:lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
(x , y) -> Integer.compare(x, y);
我们要注意的是:lambda表达式需要“函数式接口”的支持,那么什么是函数式接口呢?
函数式接口:接口只有一个抽象方法的接口,成为函数式接口可以使用注解@FunctionalInterface
四大函数式接口
函数式接口 | 参数类型 | 返回类型 | 用途 |
---|---|---|---|
Consumer < T>消费型接口 | T | void | 对类型为T的对象应用操作,包含方法:void accept (T t) |
Supplier < T>供给型接口 | 无 | T | 返回类型为T的对象,包含方法:T get(); |
Function < T,R>函数型接口 | T | R | 对类型为T的对象应用操作,并返回结果.结果是R类型的对象.包含方法:R apply(T t) |
Predicate < T>断定型接口 | T | boolean | 确定类型为T的对象是否满足某约束,并返回Boolean值.包含方法boolean test(T t) |
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
( 实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致! )
方法引用:使用操作符 “ ::” 将方法名和对象或类的名字分隔开来。
如下三种主要使用情况:
对象::实例方法
类::静态方法
类::实例方法
例如:
Compare((x,y) - > x.equals(y),”abc”,”abc”);
等同于:
Compare(String::equals,”abc”,”abc”);
注意: 当需要引用方法的第一个参数是调用对象,并且第二个参数是需要引
用方法的第二个参数(或无参数)时: ClassName::methodName
格式: ClassName::new
与函数式接口相结合,自动与函数式接口中方法兼容。
可以把构造器引用赋值给定义的方法,与构造器参数
列表要与接口中抽象方法的参数列表一致!
例如:
Function
格式: type[] :: new
例如:
Function
本篇博客就总结到这里了,下一篇咱们继续总结StreamAPI,感谢读者的阅读.