zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    分享一组很赞的 jQuery 特效【附源码下载】
    HTML5 Canvas 实现的9个 Loading 效果
    Charted – 自动化的可视化数据生成工具
    jQuery Countdown Timer 倒计时效果
    Droidicon – 1600+ 漂亮的 Android 图标
    tiltShift.js
    推荐12个最好的 JavaScript 图形绘制库
    Elastic Image Slider 带缩略图功能的幻灯片
    12款高质量的响应式 HTML5/CSS3 网站模板
    7种鼠标悬停效果,多样的图片说明展示
  • 原文地址:https://www.cnblogs.com/majestyking/p/12458002.html
Copyright © 2011-2022 走看看