美文网首页
JDK8新特性 内置函数式接口

JDK8新特性 内置函数式接口

作者: 牧心musing | 来源:发表于2021-02-24 19:11 被阅读0次

    1. 内置函数式接口由来

    lambda表达式的前提是需要有函数式接口。而且lambda表达式使用时不关心接口名,抽象方法名;只关心抽象方法的参数列表和返回值类型。因此为了让我们使用lambda方便,JDK提供了大量的常用的函数时接口。

    2. 常用内置函数式接口

    image.png

    2.1 Supplier接口

    @FunctionalInterface
    public interface Supplier<T> {
        T get();
    }
    

    2.2 Consumer接口

    @FunctionalInterface
    public interface Consumer<T> {
      void accept(T t);
    }
    

    2.3 Function接口

    @FunctionalInterface
    public interface Function<T, R> {
        R apply(T t);
    }
    

    2.4 Predicate接口

    @FunctionalInterface
    public interface Predicate<T> {
        boolean test(T t);
    }
    

    3 Supplier接口

    供给型接口,对应的lambda表达式需要“对外提供”一个符合泛型类型的对象数据,也就是lambda表达式必须有返回值

    @FunctionalInterface
    public interface Supplier<T> {
        T get();
    }
    

    通过Supplier接口中的get方法可以得到一个值并返回,无参数有返回值的接口方法。
    lambda相当于重写了这个get抽象方法。

    image.png image.png

    可以将lambda堪称是一个由参数和方法体的函数,
    调用这个printMax方法,然后printMax方法内部,当执行supplierd的唯一抽象方法get方法的时候,其实就是运行lambda表达式的时候。

    4 Consumer接口

    和Supplier接口刚好相反,他不是产生一个数据,而是消费一个数据,即lambda表达式方法体没有返回值

    @FunctionalInterface
    public interface Consumer<T> {
        public abstract void accept(T t);
    }
    

    代码如下:

    public class Demo02Consumer {
        public static void main(String[] args){
            printHello((String str)->{
                System.out.println(str.toUpperCase());
            });
        }
    
        public static void printHello(Consumer<String > consumer){
            consumer.accept("hello");
        }
    }
    

    Consumer中还有一个默认default方法andThen

        default Consumer<T> andThen(Consumer<? super T> after) {
            Objects.requireNonNull(after);
            return (T t) -> { accept(t); after.accept(t); };
        }
    

    如果一个方法有两个接口实现都需要调用accept,则需要这样


    image.png

    可以通过andThen的方法简化

    image.png

    5 Function接口

    Function接口刚好相反,需要获取一个类型的数据,然后处理得到另一个类型的数据返回,前者称为前置条件,后者称为后置条件,必须有参数有返回值。

    @FunctionalInterface
    public interface Function<T, R> {
        public abstract R apply(T t);
    }
    

    代码如下:


    image.png

    其也有andThen的默认方法


    image.png

    6 Predicate接口

    我们需要对某种类型的数据进行判断,从而得到一个boolean值结果,这时可以使用这个接口

    @FunctionalInterface
    public interface Predicate<T> {
        public abstract boolean test(T t);
    }
    

    代码如下:


    image.png

    Predicate的and no negate方法
    即使两个返回值的或与非方法。


    image.png

    相关文章

      网友评论

          本文标题:JDK8新特性 内置函数式接口

          本文链接:https://www.haomeiwen.com/subject/qxibtltx.html