常用函数式接口的使用

@FunctionalInterface注解

函数式接口在java中是指:有且仅有一个抽象方法的接口。
虽然知道怎么使用,但是没有搞懂使用场景,暂且记录下使用方法吧,不至于看到源码的时候不知所云。


要我自己写代码,我是想不起来这样用的,还做不到融汇贯通,先理解,记住,后续可能会悟到。


定义接口
 

@FunctionalInterface
public interface DeptDataPermissionRuleCustomizer {/*** 自定义该权限规则* 1. 调用 {@link DeptDataPermissionRule#addDeptColumn(Class, String)} 方法,配置基于 dept_id 的过滤规则* 2. 调用 {@link DeptDataPermissionRule#addUserColumn(Class, String)} 方法,配置基于 user_id 的过滤规则** @param rule 权限规则*/void customize(DeptDataPermissionRule rule);}

定义入参的类:
 

public class DeptDataPermissionRule {public void addDeptColumn(String tableName, String columnName){System.out.println(tableName + " add " + columnName);}public void addUserColumn(String tableName, String columnName){System.out.println(tableName + " add " + columnName);}
}

使用方法:
 

public class DataPermissionConfiguration {public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer() {return rule -> {// deptrule.addDeptColumn("dept", "id");// userrule.addUserColumn("user", "id");};}// 相当于下面的写法(为了方便理解)public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer2() {DeptDataPermissionRuleCustomizer customizer = new DeptDataPermissionRuleCustomizer() {@Overridepublic void customize(DeptDataPermissionRule rule) {rule.addDeptColumn("dept2", "id2");}};return customizer;}public static void main(String[] args) {// 使用场景DataPermissionConfiguration dataPermissionConfiguration = new DataPermissionConfiguration();dataPermissionConfiguration.sysDeptDataPermissionRuleCustomizer().customize(new DeptDataPermissionRule());dataPermissionConfiguration.sysDeptDataPermissionRuleCustomizer2().customize(new DeptDataPermissionRule());}}

Consumer
Consumer<T>

包含方法:

void accept(T t):对给定的参数执行此操作
default Consumer < T > andThen(Consumer after):返回一个组合的Consumer,依次执行此操作,然后执行after操作
andThen源码

default Consumer<T> andThen(Consumer<? super T> after) {
    Objects.requireNonNull(after);
    return (T t) -> { accept(t); after.accept(t); };
}

使用示例:

static void fun14(String name){
        Consumer<String> con1 = (str) -> System.out.println(str+"-con1");
        Consumer<String> con2 = (str) -> System.out.println(str+"-con2");
        con1.accept(name);
        con1.andThen(con2).accept(name);
    }
输出:
jack-con1
jack-con1
jack-con2


Supplier
Supplier<T>

包含方法:

T get():获得结果,该方法不需要参数,他会按照某种实现逻辑(由Lambda表达式实现)返回一个数据
Supplier< T >接口也被称为供给型接口,如果我们指定了接口的泛型是什么类型,那么接口中的get方法就会产生什么类型的数据供我们使用
    static void fun15(){
        String result = getSup(()->"a supplier");
        System.out.println(result);
    }static String getSup(Supplier<String> sup){
        return sup.get();
    }
输出:
    a supplier


Function
Function<T,R>

常用方法:

R apply(T t):对类型为T的对象应用操作,并返回结果为R类型的对象
default< V >:Function andThen(Function after):返回一个组合函数,首先将该函数应用于输入,然后将after函数应用于结果
default < V > Function<V, R> compose(Function<? super V, ? extends T> before):返回一个组合函数,该函数首先将before函数应用于其输入,然后将此函数应用于结果
andThen源码

default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }


compose源码

default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

示例:

    static void fun16(){
        String res = function("aaa",str -> str.length(),i -> i+"--func2");
        System.out.println(res);
    }
    static String function(String str,Function<String,Integer> func1,Function<Integer,String> func2){
        System.out.println(func1.apply(str));
        return func1.andThen(func2).apply(str);
    }
输出:
3
3--func2


Predicate常用方法

boolean test(T t):对给定的参数进行判断(判断逻辑由Lambda表达式实现),返回一个布尔值
default Predicate< T > negate():返回一个逻辑的否定,对应逻辑非
default Predicate< T > and(Predicate<? super T> other):返回一个组合判断,对应短路与
default Predicate< T > or(Predicate<? super T> other):返回一个组合判断,对应短路或
isEqual(Object targetRef):测试两个参数是否相等

示例

    tatic void fun17(){
        boolean res = pred("bbb", str -> str.equals("aca"), str -> str.equals("bbb"));
        System.out.println(res);
    }
    static boolean pred(String s, Predicate<String> pre1,Predicate<String> pre2){
        return pre1.or(pre2).test(s);
    }

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

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

相关文章

轻松掌控资产:企业必备的智能管理解决方案

在信息化管理日益重要的今天&#xff0c;高效管理企业的固定资产成为亟待解决的问题。我们深知企业在资产管理方面面临的挑战&#xff0c;因此推出了一款全新的资产管理解决方案&#xff0c;旨在帮助企业轻松应对资产管理中的各种难题。 特色功能 1. 资产申购 员工可通过系统便…

计算机毕业设计之:教学平台微信小程序(

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

YOLOv5的训练技巧汇总

文章目录 前言训练技巧1.训练预热 Warmup1.1 什么是训练预热 Warmup&#xff1f;1.2 常见的训练预热类型1.3 yolov5里面的warmup 2.余弦退火调整学习率 CosineAnnealingLR2.1 解释2.2 yolov5中的余弦退火 3.自适应锚框 Autoanchor3.1 什么是anchor?3.1 yolov5中的默认锚框3.3 …

【网络编程】socket套接字|sockaddr|sockaddr_in|通信过程

目录 ​编辑 源IP地址和目的IP地址 Socket 网络字节序 socket编程接口 sockaddr结构 sockaddr sockaddr_in(IPv4) sockaddr_in(IPv6) 完整的套接字&#xff08;socket&#xff09;通信过程 创建socket套接字 bind绑定套接字 listen建立监听 accept接受连接 connect…

OpenCV系列教程二:基本图像增强(数值运算)、滤波器(去噪、边缘检测)

文章目录 一、基本图像增强&#xff08;数值运算&#xff09;1.1 加法 &#xff08;cv2.add&#xff09;1.1.1 图像与标量相加&#xff08;调节亮度&#xff09;1.1.2 图像与图像相加&#xff08;两个图像shape要相同&#xff09;1.1.3 图像的加权加法&#xff08;渐变切换&…

身份证识别接口的应用场景和作用

引言 在信息化与数字化高速发展的今天&#xff0c;身份证作为个人身份的重要证明文件&#xff0c;在各行各业的应用越来越广泛。传统的身份证信息录入和审核过程通常需要人工操作&#xff0c;不仅效率低下&#xff0c;而且容易出现错误。为了解决这些问题&#xff0c;身份证识别…

C++入门基础知识八

1.介绍new与delete 1.malloc和free是函数&#xff0c;new和delete是操作符 2.malloc申请的空间不会初始化&#xff0c;new可以初始化 3.malloc申请空间失败时&#xff0c;返回的是NULL&#xff0c;因此必须判空&#xff0c;new不需要&#xff0c;但是new需要捕获异常 4.申请…

Kyutai 开源对话模型 Moshi;李飞飞空间智能公司已筹集超过 2.3 亿美元丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。 我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…

OpenAI GPT o1技术报告阅读(3)-英文阅读及理解

✨继续阅读报告&#xff1a;使用大模型来学习推理(Reason) 原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 这次我们继续看一个英文阅读理解的案例。 原问题&#xff1a; The following passage is the draft of an excerpt from a contempora…

Web开发:ABP框架3——入门级别的接口增删改查实现原理

一、上节回顾 运用了ABP框架&#xff0c;使用了EFcore进行增删改查 二、程序的入口 代码解说&#xff1a; public class Program // 定义程序主类 {public async static Task<int> Main(string[] args) // 主方法&#xff0c;返回状态码{// 配置Serilog日志Log.Logger…

手机换新,怎么把旧iPhone手机数据传输至新iPhone16手机

随着苹果公司推出了备受期待的iPhone 16。这款最新型号的iPhone不仅在设计上进行了革新&#xff0c;更在性能和功能上带来了前所未有的突破。对于那些准备从旧iPhone升级到iPhone 16的用户来说&#xff0c;最关心的问题之一就是如何把旧手机的资料转移到新手机中了。如果你不知…

Java从入门到精通学习框架(二)

在这个阶段&#xff0c;重点是掌握 Java 的高级特性&#xff0c;理解和应用常见的数据结构、Java 的并发编程模型&#xff0c;以及深入理解 Java 的内存管理机制等。通过这一阶段的学习&#xff0c;你将能够编写更加复杂和高效的程序&#xff0c;并为后续的框架学习打下坚实基础…

深度学习-图像处理篇1.1-1.2神经网络

1.1卷积神经网络基础 卷积层 对彩色RGB图像进行卷积 1.卷积核的通道数与输入特征层的通道数相同 2.卷积输出的特征矩阵通道数与卷积核个数相同 池化层 池化中一般池化核大小和步长大小一样 思考 加上偏移量bias该如何计算? 卷积计算时加上偏移量即可 加上激活函数该如何计…

Python画笔案例-055 绘制七彩浪花

1、绘制七彩浪花 通过 python 的turtle 库绘制 七彩浪花&#xff0c;如下图&#xff1a; 2、实现代码 绘制七彩浪花&#xff0c;以下为实现代码&#xff1a; """七彩浪花.py """ import turtlecs [red,orange,yellow,green,cyan,blue,magenta]…

E2VPT: An Effective and Efficient Approach for Visual Prompt Tuning

论文汇总 存在的问题 1.以前的提示微调方法那样只关注修改输入&#xff0c;而应该明确地研究在微调过程中改进自注意机制的潜力&#xff0c;并探索参数效率的极限。 2.探索参数效率的极值来减少可调参数的数量? 解决办法 提示嵌入进行transformer中 提示剪枝 Token-wise …

OpenCV_距离变换的图像分割和Watershed算法详解

在学习watershed算法的时候&#xff0c;书写代码总会出现一些错误&#xff1a; 上述代码运行报错&#xff0c;显示OpenCV(4.10.0) Error: Assertion failed (src.type() CV_8UC3 && dst.type() CV_32SC1) in cv::watershed 查找资料&#xff1a;目前已解决 这个错…

CentOS7搭建Hadoop3集群教程

一、集群环境说明 1、用VMware安装3台Centos7虚拟机 2、虚拟机配置&#xff1a;2C&#xff0c;2G内存&#xff0c;50G存储 3、集群架构设计 从表格中&#xff0c;可以看出&#xff0c;Hadoop集群&#xff0c;主要有2个模块服务&#xff0c;一个是HDFS服务&#xff0c;一个是YAR…

wordpress更换域名后用户图片头像不显示

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

【Python报错已解决】AttributeError: ‘DataFrame‘ object has no attribute ‘append‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

基于深度学习的文本情感原因提取研究综述——论文阅读

前言 既然要学习情感分析&#xff0c;那么肯定还要了解情感原因对抽取的发展历程&#xff0c;所以我又搜了一篇研究综述&#xff0c;虽然是2023年发表的&#xff0c;但是里面提及到的历程仅停留到2022年。这篇综述发布在TASLP期刊&#xff0c;是音频、声学、语言信号处理的顶级…