什么是Lambda表达式
Lambda表达式可以理解为是一种匿名函数:它没有名称,但有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常的列表。
Lambda表达式语法
(parameters) -> expression
或者
(parameters) -> {statements;}
Lambda有效语法举例
1.布尔表达式
(List<String> list) -> list.isEmpty()
2.创建对象
() -> new Apple("苹果")
3.使用一个对象
(Apple a) -> {System.out.println(a.getName());}
4.比较两个对象
(Apple a,Apple b) -> a.getName().compareTo(b.getName())
那些地方可以使用Lambda
函数式接口
函数式接口就是只定义了一个抽象方法的接口;比如Java中的Comparator、Runnable、Callabel接口。含有多个 Extension Methods 的接口也属于函数式接口。
1.Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。你也可以使用匿名内部类来完成同样的事情,只不过比较麻烦。如下示例:
public static void main(String[] args) {
/**
* 利用Ruunable接口run方法打印数据。一个类,实现Runnable接口,
* 这个类可以做很多事情,不仅仅只被用于线程,也可以用于其他功能!
*/
/*lambda表达式*/
Runnable run = () -> System.out.println("hello lambda");
/*匿名内部类*/
Runnable run2 = new Runnable() {
@Override
public void run() {
System.out.println("hello inner class");
}
};
process(run);
process(run2);
}
public static void process(Runnable runnable) {
runnable.run();
}
通过代码我们可以知道,Lambda表达式的签名要和函数式接口的抽象方法签名一致;
使用函数式接口
在JDK1.8中你会发现,函数式接口都带有@FunctionalInterface
注解,表示该接口是函数式接口,如果你用了该注解但接口又不是函数式接口,编译器就会报错。
在JDK1.6中我们常见的函数式接口有Comparator
、Runnable
、Callable
等。在JDK1.8的java.util.function
包中引入新的函数式接口,我们重点介绍一下泛型式函数接口Predicate
、Consumer
、Function
。
1. Predicate
接口定义了一个test抽象方法,它的作用就是判断入参的行为和某已知的参数行为是否匹配。除此之外,接口中还有 ```and```、```or```等默认方法。
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
如何使用Predicate
接口,比如说如何挑选红色苹果为例说明
1.苹果过滤实现
public class FilterApple {
public static <T> List<T> filterApple(List<T> lists,
Predicate<T> p) {
List<T> result = new ArrayList<>();
for (T t : lists) {
if (p.test(t)) {
result.add(t);
}
}
return result;
}
}
2.测试
/*测试*/
public static void main(String[] args) {
Apple a = new Apple();
a.setColor("green");
Apple b = new Apple();
b.setColor("red");
List<Apple> list = new ArrayList<>();
list.add(a);
list.add(b);
/*使用lambda表达式定义苹果过滤规则*/
Predicate<Apple> lambdaPredicate = (Apple apple) -> "red".equals(apple.getColor());
list = FilterApple.filterApple(list, lambdaPredicate);
System.out.println(list.toString()); //[Apple(color=red, weight=0, area=null)]
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。