• Java8新特性【函数式接口】


    一、什么是函数式接口

    函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

    函数式接口可以被隐式转换为 lambda 表达式。

    如定义了一个函数式接口如下:

    @FunctionalInterface
    interface GreetingService {
        void sayMessage(String message);
    }
    

    那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA8 之前一般是用匿名类实现的):

    GreetingService greetService1 = message -> {System.out.println("Hello " + message);};
    

    在Java8之前,常见的函数式接口有:

    java.lang.Runnable
    java.util.concurrent.Callable
    java.util.Comparator
    java.lang.reflect.InvocationHandler
    

    二、Java8内置的四大函数式接口

    在学习一段时间后会不会有这样的疑问:

    难道我要用Lambda表达式的时候总要自己写函数式接口吗?

    当然不是这样了,Java8里面提供了四大核心的函数式接口供我们使用,在符合业务要求的场景下,我们可以直接拿来使用。

    函数式接口 参数类型 返回类型 用途
    Consumer 消费型接口 T void 对类型为 T 的对象应用操作,包含方法: void accept(T t);
    Supplier 供给型接口 T 返回类型为 T 的对象,包含方法:T get();
    Function<T,R> 函数型接口 T R 对类型为 T 的对象应用操作,并返回结果。结果是 R 类型的对象。包含方法: R apply(T t);
    Predicate 断定型接口 T boolean 确定类型为 T 的对象是否满足某约束,并返回 boolean 值。包含方法: boolean test(T t);

    案例代码如下:

    /**
      * @name 消费型接口
      * @use Consumer<T>
      * @param T 传入参数
      * @fun 接受一个参数 无返回值
    * */
    Consumer<String> con=(str)->System.out.println(str);
    con.accept("我是消费型接口!");
    
    /**
      * @name 供给型接口
      * @use Supplier<R>
      * @param R 返回值类型
      * @fun 无参数 有返回值
    * */
    // Supplier<Date> supp=()-> {return new Date();};
    // 上面那一行代码可以修改为如下
    Supplier<Date> supp=()-> new Date();
    Date date=supp.get();
    System.out.println("当前时间:"+date);
    
    /**
     * @name 函数型接口
     * @use Function<T,R>
     * @param T 传入参数
     * @return R 返回值类型
     * @fun 接受一个参数 有返回值
    * */
    // Function<String, String> fun=str->{return "hello,"+str;};
    // 上面那一行代码可以修改为如下
    Function<String, String> fun=str->"hello,"+str;
    String str=fun.apply("跑调大叔!");
    System.out.println(str);
    
    /**
     * @name 断定型接口
     * @use Predicate<T>
     * @param T 传入参数
     * @return Boolean 返回一个Boolean型值
     * @fun 接受一个参数 返回Boolean型值
    * */
    // Predicate<Integer> pre=num->{return num>0;};
    // 上面那一行代码可以修改为如下
    Predicate<Integer> pre=(num)->num>0;
    Boolean flag=pre.test(10);
    System.out.println(flag);
    

    三、拓展函数式接口

    如果觉得这四个内置的函数式接口还是不够用,那么可以参考下面的一些拓展的接口,其用法与上面大同小异:

    https://www.runoob.com/java/java8-functional-interfaces.html

    Java新手,若有错误,欢迎指正!

  • 相关阅读:
    bootstrap
    史上最全Html和CSS布局技巧
    三种实现左右固定,中间自适应的三栏布局方式
    网页布局常用样式属性
    去除inline-block间隙的几种方法
    HTML&CSS——使用DIV和CSS完成网站首页重构
    I want to be a Great Web Front-end Developer
    js常用函数汇总(不定期更新)
    关于git stash的应用总结
    vue 自定义指令
  • 原文地址:https://www.cnblogs.com/Java-biao/p/14497096.html
Copyright © 2020-2023  润新知