函数式接口的使用

news/2024/9/20 4:47:25/文章来源:https://www.cnblogs.com/qimoxuan/p/18308555

Consumer 的使用(顾客)


Consumer 翻译过来的意思就是消费者,很容易理解,它就是一个只负责消费的接口。相当于你是一个餐馆的顾客,你只负责吃你点的食物。

在项目中一些不需要返回值,只负责消费的方法可以用过 Consumer 接口来实现。

示例代码

代码如下:

// 定义一个顾客(Consumer),用于消费食物
Consumer<String> customer = food -> System.out.println("吃掉了:" + food);// 厨师准备了一份美食
String food = "美味牛排";// 顾客吃掉厨师准备的食物
customer.accept(food);

Sa-Token源码中的使用

定义函数式接口:

/*** 函数式接口:对一个 [Method] 对象进行注解校验 (注解鉴权内部实现)** <p>  参数:Method句柄  </p>* <p>  返回:无  </p>** @author lingqi* @since 1.35.0*/
@FunctionalInterface
public interface SaCheckMethodAnnotationFunction extends Consumer<Method> {}

具体实现:

/*** 对一个 [Method] 对象进行注解校验 (注解鉴权内部实现)*/
public SaCheckMethodAnnotationFunction checkMethodAnnotation = (method) -> {// 先校验 Method 所属 Class 上的注解
    instance.checkElementAnnotation.accept(method.getDeclaringClass());// 再校验 Method 上的注解
    instance.checkElementAnnotation.accept(method);
};

源码

代码如下:

@FunctionalInterface
public interface Consumer<T> {void accept(T var1);default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (t) -> {this.accept(t);after.accept(t);};}
}

从代码可以看出,Consumer提供了一个接收泛型的accept方法,返回值为void。

使用例子

数据的打印

代码如下:

//由 Consumer<String> printConsumer = (s) -> System.out.println(s); 简化
Consumer<String> printConsumer = System.out::println;
printConsumer.accept("我是聪啊");

数据校验

代码如下:

Consumer<String> printConsumer = (s) -> {//判断字符串是否含有 congif (s.contains("cong")) {System.out.println("字符串含有 cong");} else {System.out.println("字符串不含有 cong");throw new RuntimeException("字符串不含 cong 啊");}
};
printConsumer.accept("我是cong");
printConsumer.accept("我不是c1ong");

Supplier的使用(厨师)

 

Supplier 好比一名厨师,它只负责生产出美味的食物,从来不关心这些是否最终的流向哪位顾客食用。

示例代码

代码如下:

// 定义一个厨师(Supplier),用于供应食物
Supplier<String> chef = () -> "美味牛排";// 厨师提供食物
String food = chef.get();
System.out.println("厨师准备了:" + food);

Sa-Token源码中的使用

代码如下:

/*** OAuth-Server端:未登录时返回的View */
public Supplier<Object> notLoginView = () -> "当前会话在OAuth-Server认证中心尚未登录";

源码

代码如下:

@FunctionalInterface
public interface Supplier<T> {T get();
}

代码十分简单,主要提供了一个返回泛型和接收泛型的 get 方法

使用例子

生成随机ID

代码如下:

//生成 uuid 由 Supplier<String> demoSupplier = () -> { return IdUtil.simpleUUID(); }; 简化
Supplier<String> demoSupplier = IdUtil::simpleUUID;
demoSupplier.get();

生成对象

代码如下:

// 使用Supplier生成Person对象
Supplier<Person> personSupplier = () -> new Person("Alice");// 获取生成的Person对象
Person person = personSupplier.get();
System.out.println("Person's name: " + person.getName());
personSupplier.get();

Function 的使用(服务员)

 

在餐厅里,服务员(Function)负责将厨师提供的食物送到顾客手中,服务员根据顾客的需求将食物进行加工或处理(例如加调料、切成小块等)。

在 Java 中,Function<T, R> 表示一个函数,它接收一个输入(食物)并返回一个输出(处理后的食物)。

示例代码

代码如下:

// 定义一个服务员(Function),用于加工食物
Function<String, String> waiter = food -> "加工后的" + food;// 厨师提供食物
Supplier<String> chef = () -> "美味牛排";
String food = chef.get();// 服务员加工食物后送到顾客手中
String processedFood = waiter.apply(food);
System.out.println("服务员送来了:" + processedFood);

Sa-Token源码中的使用

代码如下:

/*** 函数式接口:创建 SaSession 的策略** <p>  参数:SessionId  </p>* <p>  返回:SaSession对象  </p>** @author lingqi* @since 1.35.0*/
@FunctionalInterface
public interface SaCreateSessionFunction extends Function<String, SaSession> {}

源码

代码如下:

@FunctionalInterface
public interface Function<T, R> {R apply(T var1);default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {Objects.requireNonNull(before);return (v) -> {return this.apply(before.apply(v));};}default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {Objects.requireNonNull(after);return (t) -> {return after.apply(this.apply(t));};}static <T> Function<T, T> identity() {return (t) -> {return t;};}
}

Function<T, R> 是一个函数型接口,代表接受一个输入参数(类型为T),并返回一个结果(类型为R)的操作。它定义了一个名为 apply 的抽象方法,用于执行转换或计算。

使用例子

字符串转换为整数

代码如下:

// 定义一个函数,将字符串转换为整数
Function<String, Integer> stringToInt = str -> Integer.parseInt(str);// 使用函数将字符串转换为整数
String numberStr = "123";
Integer number = stringToInt.apply(numberStr);System.out.println("Converted integer: " + number);

函数组合

代码如下:

// 定义两个函数
Function<String, Integer> strToInt = str -> Integer.parseInt(str);
Function<Integer, String> intToStr = num -> "Number: " + num;// 将两个函数进行组合
Function<String, String> composedFunction = strToInt.andThen(intToStr);// 使用组合函数进行转换
String numberStr = "123";
String result = composedFunction.apply(numberStr);System.out.println("Result: " + result);

Predicate 的使用(菜单选择标准)

 

在餐厅里,菜单上的每道菜(Predicate)都有自己的特点或标准,顾客可以根据菜单上的描述(Predicate)来选择自己喜欢的食物。

在 Java 中,Predicate 表示一个断言,用于判断对象是否符合特定的条件。

示例代码

代码如下:

// 定义一个菜单选择标准(Predicate)
Predicate<String> isSteak = food -> food.equals("美味牛排");// 厨师提供食物
Supplier<String> chef = () -> "美味牛排";
String food = chef.get();// 判断食物是否符合菜单选择标准
if (isSteak.test(food)) {System.out.println("顾客点了牛排!");
} else {System.out.println("顾客选择了其他食物!");
}

源码

代码如下:

@FunctionalInterface
public interface Predicate<T> {boolean test(T var1);default Predicate<T> and(Predicate<? super T> other) {Objects.requireNonNull(other);return (t) -> {return this.test(t) && other.test(t);};}default Predicate<T> negate() {return (t) -> {return !this.test(t);};}default Predicate<T> or(Predicate<? super T> other) {Objects.requireNonNull(other);return (t) -> {return this.test(t) || other.test(t);};}static <T> Predicate<T> isEqual(Object targetRef) {return null == targetRef ? Objects::isNull : (object) -> {return targetRef.equals(object);};}static <T> Predicate<T> not(Predicate<? super T> target) {Objects.requireNonNull(target);return target.negate();}
}

Predicate 是一个断言型接口,代表一个断言(输入一个参数,返回一个布尔值的判断)。它定义了一个名为 test 的抽象方法,用于执行条件判断。

使用示例

判断是否是偶数

代码如下:

// 使用 Predicate 接口判断是否是偶数
Predicate<Integer> isEven = num -> num % 2 == 0;
System.out.println("Is 4 even? " + isEven.test(4)); // true
System.out.println("Is 7 even? " + isEven.test(7)); // false

组合多个断言

代码如下:

 // 定义两个断言
Predicate<Integer> isEven = num -> num % 2 == 0;
Predicate<Integer> isPositive = num -> num > 0;// 使用逻辑操作符组合断言
Predicate<Integer> isEvenAndPositive = isEven.and(isPositive);// 测试组合断言
System.out.println("Is 6 even and positive? " + isEvenAndPositive.test(6)); // true
System.out.println("Is -3 even and positive? " + isEvenAndPositive.test(-3)); // false
System.out.println("Is 9 even and positive? " + isEvenAndPositive.test(9)); // false

 

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

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

相关文章

Go语言之函数(func)进阶篇

目录一.init初始化函数1 初始化函数作用2 初始化函数定义案例2.1 初始化项目2.2 utils.go源代码2.3 main.go源代码二.匿名函数1 匿名函数概述2 匿名函数案例三.闭包函数1 闭包函数概述2 闭包函数案例之返回上级函数内部变量3 闭包函数案例之返回上级函数形参变量4 闭包函数返回…

linux命令入门指南

linux命令入门指南 (个人学习所用,雷同之处请忽略) 关于linux 服务器种类物理服务器 需要机房(零度、无尘、无静电)--防止机器短路,数据丢失。(建造自己的机房或者进行托管) 自己的服务器需要维护。 云服务器 由服务器厂商提供(阿里云、腾讯云)--省钱、有人维护 vmwa…

基于FPGA的MSK调制解调系统verilog开发,包含testbench,同步模块,高斯信道模拟模块,误码率统计模块

1.算法仿真效果 本程序系统是《m基于FPGA的MSK调制解调系统verilog开发,并带FPGA误码检测模块和matlab仿真程序》的的升级。升级前原文链接增加了完整的AWGN信道模型的FPGA实现,可以在testbench里面设置SNR,分析不同SNR对应的FPGA误码率情况。vivado2019.2仿真结果如下(完整…

【总结】逻辑运算在Z3中运用+CTF习题

国际赛IrisCTF在前几天举办,遇到了一道有意思的题目,特来总结。题目并不是很难,没有复杂的ollvm混淆也没有复杂的加密,但是却一步一步引导我们去学习和总结。国际赛IrisCTF在前几天举办,遇到了一道有意思的题目,特来总结。题目附件如下:📎babyrevjohnson.tar 解题过程…

在Python中使用SWCNN去除水印

在Python中使用SWCNN去除水印 说明首次发表日期:2024-07-17 SWCNN Github官方仓库: https://github.com/hellloxiaotian/SWCNN SWCNN 论文链接: https://arxiv.org/abs/2403.05807准备 运行环境 首先创建一个conda环境,安装SWCNN官方建议的库: conda create -n py39torch …

Xilinx NVMe AXI4主机控制器,AXI4接口高性能版本介绍

NVMe AXI4 Host Controller IP可以连接高速存储PCIe SSD,无需CPU,自动加速处理所有的NVMe协议命令,具备独立的数据写入和读取AXI4接口,不但适用高性能、顺序访问的应用,也适用于随机访问的应用,同时结合外部存储器(比如DDR),使得Host端的数据访问管理更加灵活。NVMe A…

请问如何将带有斜纹水印pdf的转成Excel呢?

大家好,我是Python进阶者。 一、前言 前几天在Python最强王者交流群【wen】问了一个Python自动化办公的问题,问题如下:请问如何将带有斜纹水印pdf的转成Excel呢?目前我把pdf转成图片,根据水印的颜色进行清除,但是在脱网环境下无法将图片转成Excel。 二、实现过程 后来【隔…

并发问题的三大根源是什么?

本文探讨了在多线程环境下,CPU缓存、线程切换以及编译优化如何影响数据的可见性、原子性和有序性,并提出了相应的解决方案。在单核CPU时代,所有线程共享同一缓存,确保了数据的一致性。然而,多核CPU下,各核心拥有独立缓存,可能导致线程间数据更新不可见。1.前言 从进程与…

判断语句

判断语句 猜猜心里数字:n=6 if int(input("第一次输入数字"))==n:print("猜对了") elif int(input("第二次输入数字"))==n:print("第二次猜对了") elif int(input("第三次输入数字"))==n:print("第三次对了") el…

nacos RCE

1.漏洞原理 漏洞的核心在于 Nacos 的某些接口没有严格的权限控制,攻击者可以通过通过特定的 JSON 数据结构,远程执行恶意代码。以利用该漏洞读取敏感文件、执行系统命令。 条件:需要登录后才能利用漏洞 2.影响版本 nacos 2.3.2 nacos 2.4.0 3.环境搭建 https://github.com/a…

DataFountain-个贷违约预测实战

赛题来源:Datafountain 个贷违约预测 竞赛 - DataFountain 参考优秀选手方法单模走天下:公布一个单模型精度达0.9014(B榜第8)的算法 数据科学社区-DataFountain并加入自己理解整理如下:赛题理解 题目给出了train_internet.csv、train_public.csv、test_public.csv、submit_e…