Java8的Lambda表达式
作者:互联网
Lambda表达式是什么?传递匿名函数的一种方式,它没有名称,但有参数列表、函数主体、返回类型,还有一个可以抛出的异常列表。
看不懂?没有关系,上例子:
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight())
其中红色字体就是Lambda的参数,蓝色字体就是Lambda的主体,该表达式的功能与下面的代码功能是一码事儿:
Comparator<Apple> byWeight = new Comparator<Apple>(){
public int compare(Apple a1, Apple a2) {
return a1.getWeight().compareTo(a2.getWight());
}
}
即对一个装着Apple的集合按重量排序。使用Lambda表达式即为:Comparator<Apple> byWeight = (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
从代码量上来看是少了,至于表达是否更清晰与否,就看你见Lambda的次数了,见的多了就清晰了,见的少了就一头雾水。
为了让你进一步晕,先把五种有效的Lambda表达式例出来:
(String s) -> s.length() 具有一个String类型的参数,并返回一个int,这里隐含了return语句
(Apple a) -> a.getWeight() > 150 具有一个Apple类型的参数,并返回一个boolean,这里隐含了return语句
() -> 42 没有参数,并返回一个int值
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()) 具有两个Apple类型的参数,返回一个int
(int x, int y) -> {
System.out.println("Result:" + (x + y));
} 具有两个int类型的参数,没有返回值,由于使用{},{}里面可以有多行语句
所以Lambda的基本语法为:
(parameters) -> Expression 或者 (parameters) -> { statements; }
书中立马给出几个示例,让你判断是否为有效的Lambda表达式:
() -> {}
() -> "Raoul"
() -> {return "Mario";}
(Integer i) -> return "Alan" + i;
(String s) -> {"IronMan";}
很明显前3个是,后2个不是,因为第4个箭头后面已不是表达式,它是一个statement; 第5个{}内是一个expression,而不是一个statments。
所以君呀,前面参数列表好懂,后面若是{}则里面必须为语句,若不是{}则->后必须是一个表达式。
为了让你能熟悉,再给你几个示例:
(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 Predicate<T> {
boolean test(T t); // 仅仅定义一个抽象方法
}
为了让你更明白,有一个测试题:下面哪些接口是函数式接口?
public interface Adder{
int add(int a, int b);
}
public interface SmartAdder extends Adder{
int add(double a, double b);
}
public interface Nothing(){
}
只有第一个接口是函数式接口; 第二个它定义了两个叫add的抽象方法(一个是从Adder继承来的,另一个是自定义的);第三个没有声明抽象方法。
用函数式接口可以做什么呢?
Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。
有点绕,不容易看懂,简单地来说,Lambda就是为函数式接口提供一个具体实现。
Runnable r1 = () -> System.out.println("Hello World 1");
当然你也可以使用匿名类:
Runnable r2 = new Runnable(){
public void run(){
System.out.println("Hello World");
}
}
public void process(Runnable r){
r.run()
}
实现:
process(r1);
或者
process(r2);
或者
process(() -> System.out.println("Hello World"));
标签:Apple,int,Java8,a1,a2,getWeight,表达式,Lambda 来源: https://blog.51cto.com/qingkechina/2550579