Lambda表达式能够理解为是一种匿名函数:它没有名称,但有参数列表、函数主体、返回类型,可能还有一个能够抛出的异常的列表。java
(parameters) -> expression 或者 (parameters) -> {statements;}
1.布尔表达式express
(List<String> list) -> list.isEmpty()
2.建立对象app
() -> new Apple("苹果")
3.使用一个对象ide
(Apple a) -> {System.out.println(a.getName());}
4.比较两个对象函数
(Apple a,Apple b) -> a.getName().compareTo(b.getName())
函数式接口就是只定义了一个抽象方法的接口;好比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表达式的签名要和函数式接口的抽象方法签名一致;code
在JDK1.8中你会发现,函数式接口都带有@FunctionalInterface
注解,表示该接口是函数式接口,若是你用了该注解但接口又不是函数式接口,编译器就会报错。对象
在JDK1.6中咱们常见的函数式接口有Comparator
、Runnable
、Callable
等。在JDK1.8的java.util.function
包中引入新的函数式接口,咱们重点介绍一下泛型式函数接口Predicate
、Consumer
、Function
。接口
接口定义了一个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)] }