前提
在Java8中提出了lambda表达式,而且众多大神也极力推荐使用lambda表达式进行编程,以此提高开发效率,同时提升代码质量。经常使用lambda表达式的同胞都知道,使用lambda表达式极大程度避免了空指针的问题,提高系统的稳定性。所以无论怎么说,lambda表达式使用也是必备技能。小编在项目中也用过一些简单lambda表达式,但是一般都是看网上人家怎么写,自己就跟着人家的写法,所以lambda使用局限性很大。为了打破这些局限性,小编详细学习了lambda使用,总结一下。
为什么lambda提供开发效率?
从匿名类到Lambda的转换;从使用匿名内部类作为参数传递,到使用lambda表达式作为参数传递
// 从匿名类到Lambda的转换
Runnable r1 = new Runnable() {
@Override
public void run() {
//核心内容其实就一句
System.out.println("Hello World!");
}
};
//lambda表达式
Runnable r2 = () -> System.out.println("Hello World!");
//原来的匿名内部类做参数传递
TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
});
// lambda表达式作为参数传递
TreeSet<String> ts2 = new TreeSet<>((o1, o2) -> Integer.compare(o1.length(), o2.length()));
开发的简便程度基本上一目了然!!!
通过上述使用,看出lambda本质上到底是什么?
Lambda本质就是一个匿名函数,可以把lambda理解为一段可以传递的代码(将代码像数据一样进行传递)。从而写出更简洁,更灵活的代码。因为lambda代码风格变得更加紧凑,使得Java语言表达能力得到了提升。
Lambda表达式语法
Lambda表达式在java语言中引入一个新的语法元素和操作符。即“->”,这个操作符被称为Lambda操作符或剪头操作符,将lambda分为两部分
左侧:lambda所需要的所有参数
右侧:Lambda体,即Lambda表达式要执行的功能。
lambda表达式需要“函数式接口”的支持,接口中只有一个抽象方法的接口称为函数式接口,可以使用注解@FunctionalInterface检查接口是否是函数式接口。
Lambda使用语法
1、无参数,无返回值
()-> System.out.println("Hello World");
2、有一个参数,无返回值
(e)-> System.out.println(e);
3、当只有一个参数,参数的小括号可以省略
e-> System.out.println(e);
4、有两个参数,而且有返回值
BinaryOperator<Long> bo = (x,y)->{
System.out.println("Hello World");
return x+y;
}
5、Lambda体只有一条语句时,return与大括号可以省略
BinaryOperator<Long> bo = (x,y)->x+y;
6、数据类型可以省略,编译器可以推断得出,即称为“类型推断”
类型推断
上述几种lambda语法中小编都没有写参数类型。主要原因是Lambda表达式中的参数类型都是由编译器推断得出的。Lambda表达式无需指定类型,程序依然可以编译,这是因为javac根据程序的上下文,在后台推断出了参数的类型。Lambda表达式依赖于上下文环境,是由编译器推断出来的。即为:类型推断。
通过类型推断在一定程度上减少了开发负担,提供开发效率,减少了不必要一些错误!
总结
lambda表达式就是开发者的红利,好好利用不仅能提升开发效率,还能增强程序的稳定性!由lambda引入就是函数式编程思想,也是未来发展方向,所以使用lambda是大势所趋!虽然上述讲了lambda的6种语法,但是并不复杂,个人上述六种用法归根结底就是能省则省!
如有错误之处,恳请各位大神指正,小编不胜感激!