可以把Lambda 表达式理解为一种简洁的可传递匿名函数:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。
不使用lambda表达式:
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 表达式让你可以简洁地传递代码,其基本语法如下:
(parameters) -> expression 或 (parameters) ->{ statements; }
用法示例:
布尔表达式 (List<String> list) -> list.isEmpty() 创建对象 () -> new Apple(10) 消费一个对象 (Apple a) -> { System.out.println(a.getWeight()); } 从一个对象中选择/抽取 (String s) -> s.length() 组合两个值 (int a, int b) -> a * b 比较两个对象 (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight())
在函数式接口上使用Lambda 表达式:函数式接口就是只定义一个抽象方法的接口
只有在接受函数式接口的地方才可以使用Lambda 表达式
例如:
public interface Comparator<T> { int compare(T o1, T o2); } public interface Runnable { void run(); }
用匿名内部类也可以完成同样的事情,但lambda更简洁
//lambda
Runnable r1 = () -> System.out.println("Hello World 1");
//匿名类 Runnable r2 = new Runnable(){ public void run(){ System.out.println("Hello World 2"); } }; public static void process(Runnable r){ r.run(); } process(r1); process(r2);
//直接传递lambda process(() -> System.out.println("Hello World 3"));