jdk1.8新特性——Lambda表达式与函数式接口

书到用时方恨少,由于前几日在对接公司的一个项目中,发现该项目用到了很多jdk8的新特性,代码非常的简洁,但是却由于对jdk8的新特性了解甚少,以致很多代码逻辑都看不懂,所以花了些时间学习了jdk8比较重要的几个新特性,并在此进行总结!

Lambda表达式

在java集合中,通过forEach方法遍历集合就用到了jdk1.8的新特性:Lambda表达式与函数式接口

先看forEach方法的源码:

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

由方法源码可知,forEach方法是Iterable接口(java.lang)中的一个默认方法,该方法接收一个函数式接口Consumer作为参数,Consumer接口是四大函数式接口之一,属于消费型接口,何为消费型,该接口的唯一抽象方法是void accept(T t);方法接收一个参数,但是没有返回值,也就是简单的理解成把这个参数给消费了,该方法多用于接收一个参数之后,使用输出语句输出该参数的值;该方法的处理逻辑就是将集合中的每一个元素都使用了Consumer接口的accept方法处理逻辑。

//1.匿名内部类的写法
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Consumer<Integer> consumer=new Consumer<Integer>() {
    @Override
    public void accept(Integer integer) {
        System.out.println(integer);
    }
};
list.forEach(consumer);
2.匿名内部类的写法
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.forEach(new Consumer<Integer>() {
    @Override
    public void accept(Integer integer) {
        System.out.println(integer);
    }
});
3.jdk1.8 Lambda表达式的写法
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.forEach((Integer v)-> {System.out.println(v);});

对于Lambda表达式,还可以进一步简化书写,如果方法体只有一行语句,那么可以省略语句之后的分号以及省略方法体的大括号,如果这行语句是以return返回的,还可以直接省略return。需要注意的是:一般要省略就一起省略,也就是分号、大括号、return三者一起省略;对于参数,可以省略参数的类型,另外,如果是只有一个参数,还可以省略参数的括号。

对于上面的Lambda表达式,简化写法如下:

list.forEach(v-> System.out.println(v));

四大函数式接口

函数式接口指的是接口中只包含一个抽象方法,默认方法和静态方法数量不限的接口;jdk1.8以后,还新增了@FunctionalInterface注解来标注函数式接口;所有函数式接口都位于java.util.function包下。

  1. Function:功能型函数式接口,R apply(T t); 该方法接收一个参数,并返回一个值;示例:
Function<Integer, Integer> func = p -> p * 10;    // 输出入参的10倍
  1. Consumer:消费型函数式接口,void accept(T t); 该方法接收一个参数,不做任何返回
Consumer<String> consumer= p -> System.out.println(p);    // 因为没有出参,常用于打印、发送短信等消费动作
  1. Predicate:断言型函数式接口,boolean test(T t); 该抽象方法接收一个参数,并返回一个布尔值
Predicate<Integer> predicate = p -> p % 2 == 0;    // 判断是不是偶数
  1. Supplier:供给型函数式接口,T get(); 该方法不接收任何参数,但是会返回一个值
Supplier<Integer> supplier= () -> 100; 

关于jdk1.8的其它新特性:

  1. jdk1.8新特性——Optional类:https://blog.csdn.net/can_chen/article/details/106886579
  2. jdk1.8新特性——Stream流式编程:https://blog.csdn.net/can_chen/article/details/106886484
  3. jdk1.8新特性——方法引用:https://blog.csdn.net/can_chen/article/details/106886536

猜你喜欢

转载自blog.csdn.net/can_chen/article/details/106886385