1

什么是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中我们常见的函数式接口有ComparatorRunnableCallable等。在JDK1.8的java.util.function包中引入新的函数式接口,我们重点介绍一下泛型式函数接口PredicateConsumerFunction


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)]
    }

一只小小鸟
144 声望25 粉丝

如何做一个深层次的思考者,从简单开始、从记录开始。