Java8关于Function接口

Java学习-Function接口

  • 1 函数式接口简介和学习地址
  • 2 两种常见的函数式接口
      • 2.1 Runnable:执行接口,不接收参数,也无返回结果。
      • 2.2 Consumer:作为消费接口,接收一个参数,无返回结果。
  • 3 初识
      • 3.1 定义Function接口
          • 3.1.1 定义`ThrowExceptionClass`Function`接口`
          • 3.1.2 定义`BranchHandleDemo`Function`接口`
          • 3.1.3 定义`PrentOrElseDemo`Function`接口`
      • 3.2 定义service类
          • 3.2.1 isTrue方法
          • 3.2.2 isTrueOrFalse方法
          • 3.2.3 isPresent方法
      • 3.3 定义control类
  • 4 总结

1 函数式接口简介和学习地址

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

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

参考地址1:菜鸟教程
参考地址2:B站视频

2 两种常见的函数式接口

2.1 Runnable:执行接口,不接收参数,也无返回结果。

JDK中关于Runnable的定义

2.2 Consumer:作为消费接口,接收一个参数,无返回结果。

JDK中关于Consumer的定义

3 初识

3.1 定义Function接口

  • 首先是接口Interface
  • 其次接口上方写上注解@FunctionalInterface
  • 定义抽象方法[函数式接口只能有且仅有一个方法]
3.1.1 定义ThrowExceptionClassFunction接口
package functioninterfacedemo.util;

/**
 * @author klxz
 * @description ThrowExceptionClass
 * @date 2024/4/7
 */
@FunctionalInterface
public interface ThrowExceptionClass {
    /**
     * throwMessage
     *
     * @param message message
     */
    void throwMessage(String message);
}
3.1.2 定义BranchHandleDemoFunction接口
package functioninterfacedemo.util;

/**
 * @author klxz
 * @description BranchHandleDemo
 * @date 2024/4/7
 */
@FunctionalInterface
public interface BranchHandleDemo {
    /**
     * trueOrFalseHandler
     *
     * @param trueHandler trueHandler
     * @param falseHandler falseHandler
     */
    void trueOrFalseHandler(Runnable trueHandler, Runnable falseHandler);
}
3.1.3 定义PrentOrElseDemoFunction接口
package functioninterfacedemo.util;

import java.util.function.Consumer;

/**
 * @author klxz
 * @description PrentOrElseDemo
 * @date 2024/4/7
 */
@FunctionalInterface
public interface PrentOrElseDemo<T extends Object> {
    /**
     * presentOrElseHandler
     *
     * @param consumer consumer
     * @param falseAction falseAction
     */
    void presentOrElseHandler(Consumer<? super T> consumer, Runnable falseAction);
}

3.2 定义service类

  • 命名为service目的是让大家明白这个是执行类
3.2.1 isTrue方法
  • 调用isTrue方法
  • 接收control传入的参数flag
  • 如有异常则进行Function接口ThrowExceptionClass 的处理
3.2.2 isTrueOrFalse方法
  • 调用isTrueOrFalse方法
  • 接收control传入的参数flag
  • 如有异常则进行Function接口BranchHandleDemo的处理
  • Runnable不需要接收参数,直接调用run()执行
  • 如果flag为true,则进行trueHandler.run()处理
  • 如果flag为false,则进行falseHandler.run()处理
3.2.3 isPresent方法
  • 调用isPresent()方法
  • 接收control传入的参数obj
  • 如有异常则进行Function接口PrentOrElseDemo的处理
  • Consumer需要接收一个参数,但不返回结果
  • 如果obj不为null则进行action.accept(obj)处理
  • Runnable不需要接收参数,直接调用run()执行
  • 如果obj为null则进行trueHandler.run()处理
package functioninterfacedemo;

import functioninterfacedemo.util.BranchHandleDemo;
import functioninterfacedemo.util.PrentOrElseDemo;
import functioninterfacedemo.util.ThrowExceptionClass;

/**
 * @author klxz
 * @description 工具类
 * @date 2024/4/7
 */
public class ServiceClass {
    public static ThrowExceptionClass isTrue(boolean flag) {
        return (message) -> {
            if (!flag) {
                System.out.println("current is " + message + "!");
            }
        };
    }

    public static BranchHandleDemo isTrueOrFalse(boolean flag) {
        return ((trueHandler, falseHandler) -> {
            if (flag) {
                trueHandler.run();
            } else {
                falseHandler.run();
            }
        });
    }

    public static PrentOrElseDemo<?> isPresent(String obj) {
        return (action, runnable) -> {
            if (obj != null) {
                action.accept(obj);
            } else {
                runnable.run();
            }
        };
    }
}

3.3 定义control类

分别调用service中的三个方法查看运行结果

package functioninterfacedemo;

/**
 * @author klxz
 * @description 练习函数式接口的demo
 * @date 2024/4/7
 */
public class ControlClass {
    public static void main(String[] args) {
    	// 传参为true,调用throwMessage方法
        ServiceClass.isTrue(true).throwMessage("current is false!");
        // 传参为false,调用throwMessage方法
        ServiceClass.isTrue(false).throwMessage("current is false!");


		// 传参为true,调用trueOrFalseHandler方法
        ServiceClass.isTrueOrFalse(true).trueOrFalseHandler(() -> {
            System.out.println("this is true handler!");
        }, () -> {
            System.out.println("this is false handler!");
        });
		// 传参为false,调用trueOrFalseHandler方法
        ServiceClass.isTrueOrFalse(false).trueOrFalseHandler(() -> {
            System.out.println("this is true handler!");
        }, () -> {
            System.out.println("this is false handler!");
        });


		// 传参不为null,调用presentOrElseHandler方法
        ServiceClass.isPresent("hello world!").presentOrElseHandler(System.out::println, () -> {
            System.out.println("current object is null!");
        });
		// 传参为null,调用presentOrElseHandler方法
        ServiceClass.isPresent(null).presentOrElseHandler(System.out::println, () -> {
            System.out.println("current object is null!");
        });
    }
}

4 总结

通过Function可以很优雅的写出业务逻辑代码,让代码看起来清爽~

持续学习中,有问题可以在评论区留言交流。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

渗透入门靶场大盘点

写给新手朋友入门&#xff0c;有了靶场丰富自己思路&#xff0c;也巩固自己的技术。当然新手老手都可以玩玩。 这期盘点渗透靶场&#xff0c;排名不分前后&#xff0c;还有其他靶场欢迎留言提出&#xff01;以及在留言当中评论出你最喜欢的靶场并附上理由。 本期是盘点入门必刷…

Java中学习Lambda表达式和stream中parallel并行方法

Java中学习Lambda表达式和stream中parallel并行方法 一、介绍二、整体代码 一、介绍 Lambda表达式是Java中一种方便的函数式编程风格&#xff0c;可以在集合操作中大大简化代码。而parallel()方法则是Java 8中引入的并发处理方法&#xff0c;可以让集合操作更快速高效。下面我…

qt进阶2:windows下可执行程序崩溃生成dmp,定位崩溃问题。

系列文章目录 文章目录 系列文章目录前言一、dmp文件生成二、使用步骤1.代码案例2.运行截图 前言 qt编译的可执行程序在windows下崩溃可生成dmp文件&#xff0c;用于调试定位崩溃原因。 一、dmp文件生成 略 二、使用步骤 1.代码案例 代码如下&#xff08;示例&#xff09;&…

Doodle Jump — 使用FlutterFlame开发游戏真不错!

前言 最近网上冲浪的时候&#xff0c;我偶然发现了一个国外的游戏网站&#xff0c;里面聚集了各种有趣的小游戏&#xff0c;类似于国内的4399。在浏览时&#xff0c;我遇到了一款经典的小游戏&#xff1a;Doodle Jump。上一次玩还是在上小学的时候&#xff0c;那时候父母在厨房…

2024.4.11

1.思维导图 2.指针形式验证大小端存储 #include<myhead.h>int main(int argc, const char *argv[]) {int num 0x12345678;char* ptr (char *)&num;if(*ptr 0x12){printf("big endian\n");}else if(*ptr 0x78){printf("little endian\n");}r…

LangChain-10 Agents langchainhub 共享的提示词Prompt

LangChainHub 的思路真的很好&#xff0c;通过Hub的方式将Prompt 共享起来&#xff0c;大家可以通过很方便的手段&#xff0c;短短的几行代码就可以使用共享的Prompt。 我个人非常看好这个项目。 官方推荐使用LangChainHub&#xff0c;但是它在GitHub已经一年没有更新了&#x…

Linux函数学习 epoll

1、Linux epoll函数 1.1、创建epoll实例 int epoll_create1(int flag); 返回值&#xff1a;-1 失败&#xff0c;非负数 成功 flag &#xff1a;默认传入0 1.2、管理epoll对象 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); epfd &#xff1a;e…

.a和.so库文件是什么?

我们在编译开源代码后&#xff0c;通常会生成.a和.so这两个库文件&#xff0c;这两个文件有什么区别&#xff1f;又如何使用&#xff1f; 在 Linux 中&#xff0c;.a 和 .so 文件都是库文件&#xff0c;但它们有一些区别&#xff1a; 静态库文件&#xff08;.a&#xff09;&am…

PaddleDetection 项目使用说明

PaddleDetection 项目使用说明 PaddleDetection 项目使用说明数据集处理相关模块环境搭建 PaddleDetection 项目使用说明 https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.7/configs/ppyoloe/README_cn.md 自己项目&#xff1a; https://download.csdn.net/d…

融中财经专访 | 欧科云链:从跟随行业到引领行业

导读 THECAPITAL 新行业中的经验“老兵”。 本文4089字&#xff0c;约5.8分钟 作者 | 吕敬之 编辑 | 吾人 来源 | 融中财经 &#xff08;ID&#xff1a;thecapital&#xff09; 一个新兴行业从发展到成熟需要几个必要的推手&#xff1a;人才、产品、制度。 Web3.0&…

每天五分钟深度学习:逻辑回归算法的损失函数和代价函数是什么?

本文重点 前面已经学习了逻辑回归的假设函数,训练出模型的关键就是学习出参数w和b,要想学习出这两个参数,此时需要最小化逻辑回归的代价函数才可以训练出w和b。那么本节课我们将学习逻辑回归算法的代价函数是什么? 为什么不能平方差损失函数 线性回归的代价函数我们使用…

Hystrix:实现分布式系统的延迟处理和容错保护机制

文章目录 一、Hystrix的概念与作用1.1、资源隔离1.2、熔断器模式1.3、命令模式1.4、监控和报警 二、Hystrix的使用方法三、总结 一、Hystrix的概念与作用 Hystrix是Netflix开源的一个库&#xff0c;用于处理分布式系统中的延迟和容错。它通过在服务调用之间添加保护机制&#…

Leetcode刷题-字符串详细总结(Java)

字符串 字符串可能在算法处理上面和数组是类似的&#xff0c;但是String和数组的数据结构还是有一些不一样的 1、反转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; 双指针的经典应用&#xff0c;两个指针同时向中间移动 public void reverseString(char[…

VMware启动显示“打开虚拟机时出错: 获取该虚拟机的所有权失败”

提示框&#xff08;忘截图了&#xff09;里提示目录C:\Users\mosep\Documents\Virtual Machines\VM-Win10 x64\中的某个文件&#xff08;在我这里好像是VM-Win10 x64.vmx&#xff0c;VM-Win10 x64是我给虚拟机取的名字&#xff09;在被使用中。 找到这个目录&#xff0c;删除.…

Python+Selenium+Unittest 之Unittest4(断言)

在unittest框架的TestCase类也提供了多种断言的方法。 断言常用方法 断言方法检查内容assertEqual(a,b)判断a是否等于b&#xff08;判断两个是不是同一个值&#xff09;assertNotEqual(a, b)判断a是否不等于b&#xff08;判断两个是不是同一个值&#xff09;assertTrue(a)判断a…

RAG应用开发实战(01)-RAG应用框架和解析器

1 开源解析和拆分文档 第三方的工具去对文件解析拆分&#xff0c;去将我们的文件内容给提取出来&#xff0c;并将我们的文档内容去拆分成一个小的chunk。常见的PDF word mark down, JSON、HTML。都可以有很好的一些模块去把这些文件去进行一个东西去提取。 优势 支持丰富的文…

[RK3399 Linux] 移植Linux 5.2.8内核详解

背景是在RK3399上面移植Rockchip官方提供的u-boot 2017.09 一、linux内核 1.1 源码下载 内核源码下载地址为:《https://www.kernel.org/》: 也可以到内核镜像网址下载https://mirrors.edge.kernel.org/pub/linux/kernel/,这里下载速度更快。 如果下载速度太慢,无法下载,…

2024.4.12蚂蚁庄园今日答案:豆腐在烹调时容易碎有什么办法可以避免?

原文来源&#xff1a;蚂蚁庄园今日答案 - 词令 蚂蚁庄园是一款爱心公益游戏&#xff0c;用户可以通过喂养小鸡&#xff0c;产生鸡蛋&#xff0c;并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料&#xff0c;使用鸡饲料喂鸡之后&#xff0c;会可以获得鸡蛋&…

【数学建模】机器人避障问题

已知&#xff1a; 正方形5的左下顶点坐标 ( 80 , 60 ) (80,60) (80,60)&#xff0c;边长 150 150 150机器人与障碍物的距离至少超过 10 10 10个单位规定机器人的行走路径由直线段和圆弧组成&#xff0c;其中圆弧是机器人转弯路径。机器人不能折线转弯&#xff0c;转弯路径由与…

【C++算法】线性DP详解:数字三角形、最长上升子序列、最长公共子序列、最长公共子串、字符串编辑距离

文章目录 1&#xff09;数字三角形1&#xff1a;顺推2&#xff1a;逆推 2&#xff09;最长上升子序列1&#xff1a;线性DP做法2&#xff1a;二分优化 3&#xff09;最长公共子序列4&#xff09;最长公共子串5&#xff09;字符串编辑距离 1&#xff09;数字三角形 1&#xff1a…