• Java的四大函数式接口


    1.什么是函数式接口:

    函数式接口是 Java8 引入的一个新特性,是一种特殊的接口:SAM类型的接口(Single Abstract Method),但本质上还是接口。
    相比较于其他接口,函数式接口有且只能有一个抽象方法。只要接口中出现多个抽象方法,那么就不能称之为函数式接口,运行的时候就会报错。
    为此 Java8 提供了一个新的注解@FunctionalInterface,如果接口被这个注解标注,就说明该接口是函数式接口,如果有多于一个的抽象方法,在编译的时候就会报错。
    但是这个注解不是必需的,只要接口符合函数式接口的定义,那么这个接口就是函数式接口。

    比如以下接口就是函数式接口

    java.lang.Runnable
    java.util.concurrent.Callable<V>
    foreach循环的参数也是函数式接口,而且是consumer类型的函数式接口

    2.函数式接口的特点:

    相比其它接口,函数式接口的特点:
    原则上讲,函数式接口中有且只能有一个抽象方法
    但是在 Java8 之后接口中也是可以定义方法的:默认方法和静态方法,这两种方法的定义并不会影响函数式接口的定义,可以随意使用。即:
    接口中可以有一个或多个静态方法,这不会影响到函数式接口的定义
    在 Java8 之后,接口允许定义由 default 修饰的默认方法。这些方法也不会影响到函数式接口的定义
    可以有顶级父类Object中 public 类型 的覆盖方法。比如覆盖父类中的:equals,toString,hashcode等方法
    函数式接口也支持继承,可以继承多个父接口,但是每个父接口只能有一个抽象方法,且必须是相同的抽象方法。
    函数式接口的使用,使的我们可以将方法当作参数来传递。在调用时,lambda 表达式作为参数来使用。换句话说,当一个方法的参数是 lambda 表达式时,这个参数类型一定是函数式接口.

    3.函数式接口的作用:

    它是一种特殊的接口,它也是SAM类型的接口(Single Abstract Method)类型的接口。

    函数式接口也是多线程高并发编程的一部分。
    函数式接口是大数据scala的基石,需要认真学习,好好把握。

    4.四大常见函数式接口:

     5.以下是实现上面四大接口的代码示例:

     1 import java.util.function.Consumer;
     2 import java.util.function.Function;
     3 import java.util.function.Predicate;
     4 import java.util.function.Supplier;
     5 
     6 public class FunctionInterfaceDemo {
     7     public static void main(String[] args) {
     8 //用lambda表达式定义了一个函数型接口
     9         Function<String, String> function = (str) -> {
    10             return str;
    11         };
    12         System.out.println(function.apply("I am a funcitonal interface."));
    13 
    14 //用lambda表达式定义了一个断定型接口,断定型接口会返回一个布尔值
    15         Predicate<String> predicate = (str) -> {
    16             return str.isEmpty();
    17         };
    18         System.out.println(predicate.test("Hello World."));
    19 
    20 //用lambda表达式定义了一个消费型接口
    21         Consumer<String> consumer = (str) -> {
    22             System.out.println(str);
    23         };
    24 
    25         consumer.accept("baozi");
    26 
    27 //用lambda表达式定义了一个供给型接口
    28         Supplier<String> supplier = () -> {
    29             return "厨师不要钱,并向吃货扔了一个包子";
    30         };
    31         System.out.println(supplier.get());
    32     }
    33 }

    结果:

    I am a funcitonal interface.
    false
    baozi
    厨师不要钱,并向吃货扔了一个包子

    后记:

    2020年3月10日 星期二 上海 晴 农历2020年二月二七

    参考:

    java流式编程

    https://segmentfault.com/a/1190000019855034

    java链式编程

    https://blog.csdn.net/u010061287/article/details/78953591

    java接口

    https://blog.csdn.net/qq_19782019/article/details/80259836

  • 相关阅读:
    图形控件开发商十年之旅回顾
    图表控件,数据可视化,你真的选对了吗?
    话说LightningChart是最快最美的图表控件,到底先进在哪里?
    LayUI技巧总结
    解决EFCore缓存机制导致的数据查询错误问题
    关于反射的那些骚操作
    .NetCore借助AutoMapper实现全局数据字段按角色过滤
    记录一次EFCore CodeFirst迁移实践,解决多个项目表结构同步更新问题
    SQL查询整个数据库中某个特定值所在的表和字段的方法
    Visual Studio利用正则表达式进行查找和替换
  • 原文地址:https://www.cnblogs.com/majestyking/p/12458002.html
Copyright © 2020-2023  润新知