一、Lambda表达式概述
Lambda表达式是Java8推出的新特性,是函数式编程的一种实现。通过配合函数式接口,可以使代码更加的简洁、明了,同时可以有效地减少代码量。Lambda通常用在需要使用匿名内部类的地方。Lambda表达式的主要目的就是突出对象的操作和行为,而简化其它不必要的步骤。它的一般形式如下:
List<String> list = Arrays.asList("A", "B", "C");
list.forEach(e -> System.out.println(e));
二、使用Lambda表达式
Java8中有一个forEach
方法用来遍历集合中的元素,在未使用Lambda表达式时我们需要这样使用:
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
可以看出forEach
方法需要传入一个对象作为参数,这个对象需要实现Consumer
接口,在没有使用Lambda表达式时,我们需要将整个的匿名类写出来,代码不够简洁。
1.Lambda表达式的第一种形式
list.forEach((String t) -> {
System.out.println(t);
});
可以看出,这种方式展现了Lambda的一般化形式,(String t)
表示匿名内部类中的方法的参数(在Java8新特性之接口中我们提到过函数式接口中只有一个抽象方法)以及参数类型,->
可以看作是Lambda特有的表达式,用来将参数和代码逻辑连接起来。{}
中则是代码逻辑。
2.Lambda表达式的简化模式
在1中我们探讨了Lambda表达式的通用模式,但是使用起来还有有点复杂,那么接下来我们继续简化Lambda。
在Java8中添加了类型推断的特性,通过这一特性,我们就无需写出参数的类型,这一工作将交给编译器来完成。
list.forEach((t) -> {
System.out.println(t);
});
在只有一个参数的情况下,()也可以去掉
list.forEach( t -> {
System.out.println(t);
});
在代码逻辑较为简单时,我们也可以这样写
list.forEach(t -> System.out.println(t));
3.拥有返回值的Lambda表达式
list.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return 0;
}
});
Java的List集合中有一个sort
方法,它的参数是Comparator
对象,里面的compare
方法需要返回一个int类型的值。在拥有返回值的情况下,Lambda表达式如何处理呢?
list.sort((e,t) ->{
return e.compareTo(t)
});
通常情形下,我们可以这样写。但是当代码逻辑较为简单时,比如上述情形,我们可以进一步简化
//注意这种形式,不能加return关键字,return只能在代码块{}中加
list.sort((e,t) ->e.compareTo(t));
Java编译器会进行自动类型推断,这种情形下,不需要也不能加return
注意:拥有两个以上参数的时候需要写成
(e,t,...)
这种形式
三、Lambda表达式的实际应用案例
1.创建线程对象
传统方式
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("hello");
}
}).start();
Lambda表达式
new Thread(() -> System.out.println("hello")).start();
2.数组排序
传统方式
String[] str = {"A","BB","C"};
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
Lambda表达式
Arrays.sort(str, (o1,o2) -> o1.length() - o2.length());