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可以很优雅的写出业务逻辑代码,让代码看起来清爽~

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统架构评估_2.SAAM方法

SAAM&#xff08;Scenarios-based Architecture Analysis Method&#xff09;是卡耐基梅隆大学软件工程研究所&#xff08;SEI at CMU&#xff09;的Kazman等人于1983年提出的一种非功能质量属性的架构分析方法&#xff0c;是最早形成文档并得到广泛使用的软件架构分析方法。最…

MySQL基础练习题:创建数据库

这部分主要是为了帮助大家回忆回忆MySQL的基本语法&#xff0c;数据库来自于MySQL的官方简化版&#xff0c;题目也是网上非常流行的35题。这些基础习题基本可以涵盖面试中需要现场写SQL的问题。 创建数据库 在开始练习之前&#xff0c;我默认你的电脑上是没有本系列练习题需要…

物联网可视化平台

随着数字化转型的深入&#xff0c;物联网技术正在成为企业实现智能化、高效化运营的重要工具。物联网可视化平台&#xff0c;作为连接物理世界与数字世界的桥梁&#xff0c;为企业提供了直观、实时的数据展示和监控能力&#xff0c;从而在数字化转型中扮演着关键角色。 一、物…

内外网数据交换发展进程:安全与便捷并行

随着信息化的不断推进&#xff0c;医院、党政以及企业的内外网数据交换正成为日益关注的焦点。在保障数据安全的前提下&#xff0c;需要寻求一种既安全可靠又操作便捷的数据传输方式。本文将探讨内外网数据交换发展进程&#xff0c;分析各种传输方式的优缺点&#xff0c;以及它…

HG-SL:基于全局和局部用户行为的新闻

一、概述 本文的主要目标是&#xff0c;仅通过用户行为来判断新闻的真伪。其之所以抛弃传统的基于视频内容、用户反馈&#xff08;点赞和评论&#xff09;等信息&#xff0c;是认为&#xff0c;这些内容很容易存在造假的情况&#xff08;即有水军机器人操控&#xff09;。而基于…

css anminate 加载中三个点点动态出现

期待效果&#xff1a; 核心代码&#xff1a; css3 anminate方法 //html <div>加载中<span id"dot">...</span></div>//css <style>   #dot {display: inline-block;width: 1.5em;vertical-align: bottom;overflow: hidden;animati…

Linux初学(十七)redis

一、简介 redis就是一个内存数据库 redis中的数据&#xff0c;都是保存在内存中 端口&#xff1a;6379 二、安装redis 方法一&#xff1a;编译安装 方法二&#xff1a;yum安装-epel 第一步&#xff1a;配置epel源 详见&#xff1a;http://t.csdnimg.cn/AFl1K第二步&#xff1a…

【pycharm报错】rror: Microsoft Visual C++ 14.0 or greater is required.

一、报错 二、下载vs 路径&#xff1a;https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/ 三、安装 四、安装成功并启动 重新安装chromadb成功

MTK i500p AIoT解决方案

一、方案概述 i500p是一款强大而高效的AIoT平台&#xff0c;专为便携式、家用或商用物联网应用而设计&#xff0c;这些应用通常需要大量的边缘计算&#xff0c;需要强大的多媒体功能和多任务操作系统。该平台集成了Arm Cortex-A73 和 Cortex-A53 的四核集群&#xff0c;工作频…

YOLO算法改进Backbone系列之:PVT

摘要&#xff1a;尽管基于CNNs的backbone在多种视觉任务中取得重大进展&#xff0c;但本文提出了一个用于密集预测任务的、无CNN的的简单backbone——Pyramid Vision Transformer&#xff08;PVT&#xff09;。相比于ViT专门用于图像分类的设计&#xff0c;PVT将金字塔结构引入…

Python常用算法--解决数据结构问题【附源码】

一、约瑟夫环问题 解释:约瑟夫环(Josephus Problem)是一个著名的数学问题,它描述了一个关于围坐一圈的人进行游戏的场景。游戏规则是从一个人开始,顺序报数,每报到特定数目的人将会被排除出圈子,然后从被排除的下一人开始继续报数,游戏继续进行直到最后剩下一个人。 …

SAP 资产管理中如何调整折旧(摊销)金额

在资产管理的日常中可能涉及资产折旧金额的调整&#xff08;或者需要调增折旧&#xff0c;或者调减折旧额&#xff09;。这是需要使用到事务代码ABAA或者ABMA。在SAP中&#xff0c;ABAA和ABMA是两个不同的事务代码&#xff0c;它们都与固定资产折旧相关&#xff0c;但用途和处理…