Java—JDK8新特性—函数式接口【内含思维导图】

news2024/9/24 1:16:22

目录

3.函数式接口

思维导图

3.1 什么是函数式接口

3.2 @functionalinterface注解 源码分析

3.3 Lambda表达式和函数式接口关系

3.4 使用函数式接口

3.5 内置函数式接口

四大核的函数式接口区别

3.5.1 Supplier 函数式接口源码分析

3.5.2 Supplier 函数式接口使用

3.5.3 Consumer 函数式接口源码分析

3.5.4 Consumer 函数式接口使用 

3.5.5 Function 函数式接口源码分析

3.5.6 Function 函数式接口使用 

3.5.7 Predicate 函数式接口源码分析

3.5.8 Predicate 函数式接口使用 


3.函数式接口

思维导图

3.1 什么是函数式接口

        如果一个接口中只包含一个抽象方法,这个接口称为函数式接口

如果一个接口包含,一个抽象方法、一个默认方法、一个静态方法,这个接口也是函数式接口


3.2 @functionalinterface注解 源码分析

        一个标记性注解

        在定义接口是函数式接口时,可以使用 @functionalinterface 注解进行标注,该注解会在编译器对这个接口进行检查

        如果使用@functionalinterface 注解来定义接口,编译器将会强制检查该接口,是否只有一个抽象方法,否则会报错。


3.3 Lambda表达式和函数式接口关系

        Lambda表达式就是一个函数式接口的实例

        如果一个对象是函数式接口的实例,那么该对象就可以用Lambda表达式,用匿名实现类表示的地方都可以用Lambda表达式替换


3.4 使用函数式接口

        可以使用JDK中内置的函数式接口,也可以自定义函数式接口

案例1:

先定义一个函数式接口

@FunctionalInterface
public interface MyFun<T> {
    T getValue(T t);
}

写一个实现类,FunctionInterfaceDemo1,进行对给定字符串转为大写

/**
 * 函数式接口使用
 */
public class FunctionInterfaceDemo1 {
    public static void main(String[] args) {
        //需求: 使用函数式接口,将给定的字符转为大写

        //1.使用原始方法
        System.out.println(toUpperCase("hello"));

        //2.使用函数式接口
        String result1 = toLowerCase(new MyFun<String>() {
            @Override
            public String getValue(String s) {
                return s.toUpperCase();
            }
        }, "hello");

        System.out.println("result1:" + result1);

        String result2 = toLowerCase( s -> s.toUpperCase(), "hello");
        System.out.println("result2:" + result2);

    }
    // 定义一个方法,将给定的字符串转为大写
    public static String toUpperCase(String str) {
        return str.toUpperCase();
    }

    /**
     * 将给定的字符串转为大写
     * @param function 函数式接口
     * @param str 给定字符串
     * @return
     */
    public static String toLowerCase(MyFun<String> function, String str) {
        return function.getValue(str);
    }
}

运行结果:


3.5 内置函数式接口

在JDK8中内置了以下四大核的函数式接口

        Supplier接口、Consumer接口、Function接口、Predicate接口 

四大核的函数式接口区别

函数式接口参数类型返回类型使用说明
Consumer<T>Tvoid

对类型为T的对象应用操作,

包含方法:void accept(T t)

Supplier<T>T

返回类型为T的对象,

包含方法:T get()

Function<T,R>R

对类型为T的对象应用操作,

并返回结果为R类型的对象。包含方法:Rapply(T t)

Predicate<T>Tboolean

确定类型为T的对象是否满足某约束,

并返回布尔值。包含方法: booleantest(T t)

3.5.1 Supplier 函数式接口源码分析

3.5.2 Supplier 函数式接口使用

案例:

/**
 * JDK内置Supplier函数式接口的使用
 */
public class SupplierDemo1 {
    public static void main(String[] args) {

        getMax(new Supplier<Integer>() {
            @Override
            public Integer get() {
                //1.定义一个数组
                int[] arr = {12,23,34,94,555,60,27,38,99};
                //2.对数组进行排序
                Arrays.sort(arr);
                //3.将最大值返回
                return arr[arr.length - 1];
            }
        });

        getMax(() ->{
                //1.定义一个数组
                int[] arr = {12,23,34,94,555,60,27,38,99};
                //2.对数组进行排序
                Arrays.sort(arr);
                //3.将最大值返回
                return arr[arr.length - 1];

        });
    }

    private static void getMax(Supplier<Integer> supplier) {
        int max = supplier.get();
        System.out.println(max);
    }
}

运行结果:

3.5.3 Consumer 函数式接口源码分析

         消费一个数据,其数据类型由泛型参数决定

        Consumer 函数式接口,可以通过accept()方法参数传递过来的数据进行处理

        有参无返回接口

3.5.4 Consumer 函数式接口使用 

案例:

/**
 * JDK内置 消费型函数式接口 Consumer 使用
 */
public class ConsumerDemo {
    public static void main(String[] args) {
        transform(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s.toUpperCase());
            }
        });

        transform(s -> System.out.println(s.toUpperCase()));

    }

    public static void transform(Consumer<String> consumer) {
        consumer.accept("hello Consumer");
    }
}

3.5.5 Function 函数式接口源码分析

        根据一个类型的数据得到另外一个类型的数据,有参有返回

        Function转换型接口,对apply()方法传入的T类型数据进行处理,返回R类型的结果

3.5.6 Function 函数式接口使用 

案例:

/**
 * JDk内置功能型接口 Function 使用
 */
public class FunctionDemo {
    public static void main(String[] args) {
        System.out.println(calculate(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                return  Integer.parseInt(s);
            }
        }));
        System.out.println(calculate( s-> Integer.parseInt(s)));

        System.out.println(calculate1(s-> Integer.parseInt(s), i -> i +5));
    }

    public static int calculate(Function<String,Integer> function) {
        Integer value = function.apply("10");
        return value + 5;
    }
    public static int calculate1(Function<String,Integer> f1,Function<Integer,Integer> f2) {
        Integer value2 = f1.andThen(f2).apply("10");
        return value2;
    }
}

3.5.7 Predicate 函数式接口源码分析

        需要对某种类型的数据进行判断,从而得到一个Boolean值结果,常用于条件判断场景

3.5.8 Predicate 函数式接口使用  

/**
 * JDK内置断言函数式接口 Predicate 使用
 */
public class PredicateDemo {

    public static void main(String[] args) {
        testName(s -> s.length() > 3,"张三");

        testAnd(
                s -> s.contains("A"),
                s -> s.contains("B"),
                "ABC"
        );

        testAnd(
                s -> s.contains("A"),
                s -> s.contains("B"),
                "Abc"
        );

        testOr(
                s -> s.contains("Z"),
                s -> s.contains("Y"),
                "Zxc"
        );

        testOr(
                s -> s.contains("Z"),
                s -> s.contains("Y"),
                "zxc"
        );

        testNegate(
                s -> s.contains("Q"),
                "iQ"
        );
        testNegate(
                s -> s.contains("Q"),
                "asd"
        );
    }

    /**
     * 使用Lambda表达式判断 名字长度是否超过3个字
     */
    private static void testName(Predicate<String> predicate,String name) {
        System.out.println(predicate.test(name) ? "超过3个字" : "没有超过3个字");
    }

    /**
     * 使用Lambda表达式判断一个字符中,包含A,包含B
     * 使用了Predicate 中的 and 与
     * default Predicate<T> and(Predicate<? super T> other) {
     *         Objects.requireNonNull(other);
     *         return (t) -> test(t) && other.test(t);
     *     }
     */
    private static void testAnd(Predicate<String> p1,Predicate<String> p2,String str) {
        System.out.println(p1.and(p2).test(str) ? "yes" : "no");
    }

    /**
     * 使用Lambda表达式判断一个字符中,可能包含Z 或者 可能 包含Y
     * 使用了Predicate 中的 or 或
     * default Predicate<T> or(Predicate<? super T> other) {
     *         Objects.requireNonNull(other);
     *         return (t) -> test(t) || other.test(t);
     *     }
     */
    private static void testOr(Predicate<String> p1,Predicate<String> p2,String str) {
        System.out.println(p1.or(p2).test(str) ? "可能包含Z 或者 可能 包含Y" : "不包含Z 不包含Y");
    }

    /**
     * 使用Lambda表达式判断一个字符中,可能不包含Q
     * 使用了Predicate 中的
     * default Predicate<T> negate() {
     *         return (t) -> !test(t);
     *     } 
     *
     */

    private static void testNegate(Predicate<String> p1, String str) {
        System.out.println(p1.negate().test(str) ? "不包含Q" : "包含Q");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/510522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于AT89C51单片机的篮球计时记分设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87771065 源码获取 主要内容: 基于51单片机设计篮球计时计分器,结合单片机串行接口原理,用AT89C51设计一个篮球比赛计分计时器,能够通过数码管显示分数和比赛时间(并设有…

linux驱动-gpio

最近处理es8336声卡问题&#xff0c;最后排查是spk_ctl_gpio和hp_det_gpio这两个gpio导致的&#xff0c;所以恶补了一下gpio相关的知识&#xff0c;现在总结一下。 源代码使用的是飞腾的gitee上开源的内核&#xff1a;https://gitee.com/phytium_embedded/phytium-linux-kernel…

什么是SVG格式?如何制作?

图像质量对页面非常重要——扭曲和缩放变形的标志、图标或照片会使页面看起来粗糙和不协调&#xff0c;这个问题只会因为响应设计而复杂。 访问者通过桌面机和智能手机查看应用程序&#xff0c;因此无论使用什么设备&#xff0c;图像都应该进行优化。如果有一个数字格式可以让…

基于FPGA+JESD204B 时钟双通道 6.4GSPS 高速数据采集设计(三)连续多段触发存储及传输逻辑设计

本章将完成数据速率为 80MHz 、位宽为 12bits 的 80 路并行采样数据的连续多 段触发存储。首先&#xff0c;给出数据触发存储的整体框架及功能模块划分。然后&#xff0c;简介 MIG 用户接口、设置及读写时序。最后&#xff0c;进行数据跨时钟域模块设计&#xff0c;内存…

XC7VX690T PCIE 硬件设计注意事项

首先参考PG023找到对应封装支持的位置 然后参考UG476找到对应的实际物理位置 XILINX 也有给出对应的推荐位置

gitlab服务器发送邮件配置

1.修改gitlab的配置文件&#xff1a; vim /etc/gitlab/gitlab.rb 这里具体的gitlab.rb文件所在路径需要根据实际的来 找到如下图所示的部分&#xff0c;放开注释&#xff0c;修改配置&#xff0c;此处我用的发件邮箱是QQ邮箱&#xff0c;所以域名配置都是qq.com&#xff0c;…

Springboot application/yaml/yml没有提示解决方案

有下面提示别安装该插件 卸载wl spring assistant plugin就好了,标志是yml图标变成六边形

线程间互斥-mutex互斥锁和lock_guard

要点 锁双重判断的技法 竟态条件&#xff1a;多线程程序执行的结果一致&#xff0c;不会随着CPU对线程不同的调用顺序 线程间安全实例——3个窗口同时卖票 线程不安全的代码如下 int ticketCount 100; // 100张车票 // 模拟10个窗口同时卖票 void sellTicket(int index) …

PostgreSQL11 | 索引

截止到上一篇《PostgreSQL11 | 查询数据》属于pgsql的基础部分就算是都总结完了&#xff0c;从这一篇&#xff08;第9章&#xff09;开始一直到本专栏最后一篇文章&#xff08;第14章&#xff09;都是进阶部分&#xff0c;sql量会减弱&#xff0c;抽象的概念会越来越多&#xf…

数字识别问题

文章目录 6.1 MNIST数据处理6.2.1 训练数据6.2.2 变量管理6.3.1 保存模型6.3.1 加载计算图6.3.1 加载模型6.3.2 导出元图 6.1 MNIST数据处理 在直接在第6章的目录下面创建文件 compat.v1.是tensorflow2.x的语法&#xff0c;全部删掉 删除compat.v1.后的代码 # -*- coding: …

【SCI一区】考虑P2G和碳捕集设备的热电联供综合能源系统优化调度模型(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

学术必备的21个论文网站,建议收藏!

1、综合型论文网站&#xff08;国内&#xff09; &#xff08;1&#xff09;知网 介绍&#xff1a;国内知名度最高的网站&#xff0c;拥有上亿篇各种论文期刊&#xff0c;包含中国学术文献、 外文文献、学位论文、报纸、会议、年鉴、工具书等各类资源统一检索、统一导 航、…

第四章 图像的形态学操作

文章目录 前言一、阈值控制二、腐蚀与膨胀1.腐蚀2.膨胀3.形态学操作 总结 前言 前面讲解了图像基础理论、图像的变换以及图像滤波等操作&#xff0c;本章&#xff0c;将会介绍图像的形态学操作。 图像的形态学指的是一组数学方法和工具&#xff0c;用于图像分析和处理。形态学…

(7)Qt---文件IO

目录 1. QFileDialog 文件选择对话框** 2. QFileInfo 文件信息类** 3. QFile 文件读写类*** 4. UI与耗时操作** 5. QThread 线程类 5.1 复现阻塞 5.2 新建并启动子线程 5.3 异步刷新 5.4 停止线程 1. QFileDialog 文件选择对话框** 操作系统会提供一个统一样式的文件选择对话框…

从本地到云端:豆瓣如何使用 JuiceFS 实现统一的数据存储

豆瓣成立于 2005 年&#xff0c;是中国最早的社交网站之一。在 2009 到 2019 的十年间&#xff0c;豆瓣数据平台经历了几轮变迁&#xff0c;形成了 DPark Mesos MooseFS 的架构。 由机房全面上云的过程中&#xff0c;原有这套架构并不能很好的利用云的特性&#xff0c;豆瓣需…

少林派问题汇总

少林派问题汇总&#xff1a; Q: A:缺少bmodel,没有指定bmodel的路径&#xff0c;测试图片不在同一文件路径下 复制过来就解决了 Q: docker容器下运行./install_lib.sh nntc会rm不到文件怎么回事? A&#xff1a;文件已经被删除 Q: 我将pytorch的模型用export工具转换成.torch…

聚焦丨酷雷曼荣列XRMA联盟成员单位

自“元宇宙”概念兴起之初&#xff0c;酷雷曼VR所属北京同创蓝天云科技有限公司就积极布局、探索和实践。2022年12月&#xff0c;酷雷曼VR成功加入虚拟现实与元宇宙产业联盟&#xff08;XRMA&#xff09;&#xff0c;正式被接纳为联盟成员单位&#xff0c;意味着酷雷曼公司将进…

详细版易学版TypeScript - 元组 枚举详解

一、元组(Tuple) 数组:合并了相同类型的对象 const myArr: Array<number> [1, 2, 3]; 元组(Tuple):合并了不同类型的对象 // 定义元组时就要确定好数据的类型&#xff0c;并一一对应 const tuple: [number, string] [12, "hi"]; // 添加内容时&#xff0c;不…

代码随想录算法训练营day35 | 860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球

代码随想录算法训练营day35 | 860.柠檬水找零&#xff0c;406.根据身高重建队列&#xff0c;452. 用最少数量的箭引爆气球 860.柠檬水找零406.根据身高重建队列452. 用最少数量的箭引爆气球 860.柠檬水找零 教程视频&#xff1a;https://www.bilibili.com/video/BV12x4y1j7DD/…

3.SpringBoot开发实用篇

SpringBoot开发实用篇 ​ 开发实用篇中因为牵扯到SpringBoot整合各种各样的技术&#xff0c;由于不是每个小伙伴对各种技术都有所掌握&#xff0c;所以在整合每一个技术之前&#xff0c;都会做一个快速的普及&#xff0c;这样的话内容整个开发实用篇所包含的内容就会比较多。各…