为了更容易的了解lambda表达式,让我们先来看几个那lambda表达式和匿名内部类作比较的例子。在第一个例子中,我们会看到使用lambda表达式来实现一个 Comparator 接口。假设我们有一个Person 类,该类有一个name属性,并且,我们创建了一个Person类型的数组,名为persons。
Arrays.sort(persons, new Comparator() {
@Override
public int compare(Person first, Person second) {
return first.getName().compareTo(second.getName());
}
});
// 这也是一个标准的排序,但是有趣的是,它传入的是一个lambda表达式,而不是一个Comparator类型的对象
Arrays.sort(persons,(first, second) -> first.getName().compareTo(second.getName()));
注意到5行的代码被精简到了1行,这就是lambda表达式比匿名内部类漂亮的地方。接下来,让我们看一个用lambda表达式来实现 Runable 接口的例子。结果也是一样。
Runnable printer = new Runnable() {
@Override
public void run() {
System.out.println("Hello, I’m inside runnable class...");
}
};
printer.run();
printer = () -> System.out.println("Hello, I’m inside runnable lambda...");
printer.run();
为用户自定义的接口写lambda表达式也同样是间非常简单容易的事。下面的例子使用 Operator自定义接口,并且将lambda表达式的引用保存在了变量中,以便重用。
Operator addition = (op1, op2) -> op1 + op2;
System.out.println("Addition result: " + addition.operate(2, 3));
为了更深入的理解,这里有一个使用了代码块的lambda表达式的例子。
interface GenericOperator {
TYPE operate(TYPE ... operands);
}
//使用了代码块的lambda表达式
GenericOperator multiply = numbers -> {
int result = 0;
for(int num : numbers)
result *= num;
return result;
};
System.out.println("Multiplication result: " + multiply.operate(2,3,4));
如上所示,代码块就如同一个普通方法的代码块,lambda表达式就如同一个方法,但是它更有意义。