Java8新特性之Lambda表达式
Lambda表达式可以简单的理解为可传递的匿名函数的一中方式,它没有名称,但它有参数列表、函数主体、返回类型。可以让我们编程更加的方便。
在Java8引入了一个新的基础语法:就是一个“->”。该操作符称为箭头操作符或者Lambda操作符。
箭头将Lambda表达式拆分为两个部分
- 左侧:Lambda表达式的参数列表
- 右侧:Lambda表达式中所需执行的功能,即Lambda体
Lambda的语法格式
语法格式一:无参数,无返回值
() -> System.out.println("Hello Lambda!");
语法格式二:有一个参数,并且无返回值
(x) -> System.out.println(x)
语法格式三:若只有一个参数,小括号可以省略不写
x -> System.out.println(x)
语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
Comparator<Integer> com = (x, y) -> {
System.out.println("函数式接口");
return Integer.compare(x, y);
};
语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
//即以下代码中的“Integer”可以省略
(Integer x, Integer y) -> Integer.compare(x, y);
接下来我将以代码演示,在Java8之前没lambda表达式的样子,以及有lambda表达式后的变化。
在Java8之前没有Lambda表达式
public void test1(){
//最原始:首先自定义一个排序类,再作为参数传递给TreeSet
Comparator<String> com = new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
};
TreeSet<String> ts = new TreeSet<>(com);
//优化1:排序类使用匿名对象
TreeSet<String> ts2 = new TreeSet<>(new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
});
}
有lambda表达式之后
//现在的 Lambda 表达式
@Test
public void test2(){
TreeSet<String> ts2 = new TreeSet<>((x, y) -> Integer.compare(x.length(), y.length()));
}
是不是感觉非常的简洁,也不用写很多无用的代码了。其实我们关注的只是单单那一行。
Lambda表达式
举例
用Runnable执行代码块
之前
Thread t = new Thread(new Runnable() {
public void run(){
System.out.println("Hello world");
}
});
之后(用了Lambda表达式)
Thread t = new Thread(() -> System.out.println("Hello world"));
用Comparator进行排序
之前
Comparator<Apple> byWeight = new Comparator<Apple>() {
public int compare(Apple a1, Apple a2){
return a1.getWeight().compareTo(a2.getWeight());
}
};
之后(用了Lambda表达式)
Comparator<Apple> byWeight = (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
在第一次接触这个lambda表达式时可能感觉会有点别扭,但是不得不承认,代码看起来更清晰了!我们传递的只是比较苹果的重量或者关注的真正需要运行的代码。
总的来说,Lambda表达式免去了使用匿名方法的麻烦,给予Java强大的函数化编程的能力。
而且lambda表达式常和函数式接口一起使用,他们是不可分割的。
关于函数式接口在lambda表达式与函数式接口也进行了总结。