zoukankan      html  css  js  c++  java
  • 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新手,若有错误,欢迎指正!

  • 相关阅读:
    try catch finally语句块中存在return语句时的运行流程
    【Java学习】异常
    【Java学习】面向对象(二)——封装、继承、多态、抽象
    【ASP.NET开发Web项目】vs2019新建ASP.NET空网站,没有出现Default.aspx
    【ASP.NET开发Web项目】VS2019项目模板中没有ASP.NET空网站
    【Java学习】面向对象(一)
    【Java学习】数组的初始化、特点及基础操作(冒泡排序)
    Jmeter接口测试和压力测试的配置和使用
    【Java学习】递归算法之斐波那契数列、100以内的阶乘
    【Java学习】进制转换、二进制原码反码补码和位运算
  • 原文地址:https://www.cnblogs.com/Java-biao/p/14497096.html
Copyright © 2011-2022 走看看