【Java 8实战】第2篇:Lambda表达式

什么是Lambda表达式

Lambda表达式能够理解为是一种匿名函数:它没有名称,但有参数列表、函数主体、返回类型,可能还有一个能够抛出的异常的列表。java

Lambda表达式语法

(parameters) -> expression
或者
(parameters) -> {statements;}
Lambda有效语法举例

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())

那些地方可使用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表达式的签名要和函数式接口的抽象方法签名一致;code

使用函数式接口


在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)]
    }
相关文章
相关标签/搜索