这几天又学习了一遍关于jdk8中lambda表达式,以前也看过一遍,由于没怎么用过,只是看别人代码时用过lambda,也没有做笔记,时间一长就忘的差不多了。为了吸取教训,这次看了后,做下笔记,供以后参考学习。
jdk8中加入了两大技术,一是lambda表达式,二是加入到stream流。
一、基本概念
为了方便学习理解,先了解些基本概念
lambda表达式概念:lambda表达式是 一种匿名函数, lambda表达式有参数列表,函数主体、返回值类型,还可能有异常列表。
个人理解就是,lambda表达式就是比匿名类写法更简单的一种写法,也就是匿名类都可以改成lambda表达式写法,前提是匿名类必须是函数式接口。lambda表达式就是函数式接口中抽象方法的另一种描述。
lambda表达式格式:(parameters) -> expression 或者 (parameters) -> { statements; }
例子: (Apple a) -> a.getColor();
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
函数式接口:只定义一个抽象方法的接口。
在jdk8中提供了好多函数式接口,这样的接口都用一个注解@FunctionalInterface标注
在哪里可以使用lambda表达式呢?只能在函数式接口出现的地方使用lambda表达式。
二、具体例子
首先,有个函数式接口,代码如下:
public interface ApplePredicate{
boolean test (Apple apple);
}
其次,有个筛选苹果的方法,代码如下:
public static List<Apple> filterApples(List<Apple> inventory,
ApplePredicate p){
List<Apple> result = new ArrayList<>();
for(Apple apple: inventory){
if(p.test(apple)){
result.add(apple);
}
}
return result;
}
然后,匿名类是这么写的:
List<Apple> redApples = filterApples(inventory, new ApplePredicate() {
public boolean test(Apple apple){
return "red".equals(apple.getColor());
}
});
最后,lambda表达式是比匿名类更简洁的一种写法,如下:
List<Apple> redApples =
filterApples(inventory, (Apple apple) -> "red".equals(apple.getColor()));
这个看起来比匿名类的写法简洁多了,而且还更加易懂。
注意: filterApples方法的第二个参数是一个函数式接口ApplePredicate,所以这里可以使用lambda表达式。也就是有函数式接口的地方都可以替换为lambda表达式,在jdk8之前,都是用匿名类的写法,jdk8开始可以使用lambda表达式替代匿名类,写法更简洁易懂了。