Lambda 表达式,也可称为闭包,Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中),使用 Lambda 表达式可以使代码变的更加简洁紧凑,Lambda表达式还增强了集合库。 Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包以及java.util.stream 包。 流(stream)就如同迭代器(iterator),但附加了许多额外的功能。
虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能,建议不要乱用,因为在某些情况下不利于维护。
语法
(parameters) -> expression
或
(parameters) ->{ statements; }
Lambda 表达式的重要特征:
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
Lambda 表达式使用注意事项:
- Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。
- Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。
简单样例
1、实现Runnable线程
public class LambdaDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//方式一:匿名内部类实现
Runnable runTest = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 0; i < 10; i++) {
System.out.println("结果是:"+i);
Thread.yield();
}
}
};
//方式二:Lambda表达式实现
Runnable runTest2 = ()->{
for(int i = 10; i < 20; i++) {
System.out.println("结果是:"+i);
Thread.yield();
}
};
Thread t1 = new Thread(runTest);
Thread t2 = new Thread(runTest2);
t1.start();
t2.start();
//方式三:Lambda表达式更为简单的实现
new Thread(()->{
for(int i = 20; i < 30; i++) {
System.out.println("结果是:"+i);
Thread.yield();
}
}).start();;
}
}
2、普通无参数Lambda表达式实现
//定义一个接口
public interface PersonInterface {
public void speak();
}
//方法体
public class Person {
public static void main(String[] args) {
// TODO Auto-generated method stub
PersonInterface per = ()->{
System.out.println("这是通过Lambda表达式实现PersonInterface接口");
};
per.speak();//很重要,要不然没有输出结果
}
}
3、普通有参数Lambda表达式实现
//定义一个接口
public interface PersonInterface {
public void speak(String str);
}
//方法体
public class Person {
public static void main(String[] args) {
// TODO Auto-generated method stub
PersonInterface per = (String str)->{
System.out.println("这是通过Lambda表达式实现PersonInterface接口"+str);
};
per.speak("\n实现成功");
}
}
4、实现事件处理
import java.awt.*;
import javax.swing.*;
public class Person {
public static void main(String[] args) {
// TODO Auto-generated method stub
JButton button = new JButton();
button.addActionListener((e)->{
System.out.println("这是一个Lambda表达式按实现的监听器");
});
}
}
5、实现集合的遍历
import java.util.*;
public class Person {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> aList = new ArrayList<Integer>();
aList.add(1);
aList.add(2);
aList.add(3);
aList.add(4);
aList.add(5);
aList.forEach((n)->{
System.out.println("通过Lambda表达式实现List集合遍历,该数是:"+n);
});
}
}
6、简单实现排序
import java.util.*;
import java.math.*;
public class Person {
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] players = {"Rafael Nadal", "Novak Djokovic",
"Stanislas Wawrinka", "David Ferrer",
"Roger Federer", "Andy Murray",
"Tomas Berdych", "Juan Martin Del Potro",
"Richard Gasquet", "John Isner"};
//方式一:
Comparator<String> sortByName = (String s1, String s2) -> (s1.compareTo(s2));
Arrays.sort(players, sortByName);
//方式二:
Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2)));
for(String str:players) {
System.out.println(str);
}
}
}