当前位置: 首页 > news >正文

常用函数式接口的使用

@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.mrgr.cn/news/30907.html

相关文章:

  • SpringBoot开发——整合SpringDoc实现在线接口文档
  • 一文搞懂软著申请细则!
  • 上海市计算机学会竞赛平台2024年7月月赛丙组子集归零
  • 数据库数据恢复—SQL Server附加数据库出现“错误823”怎么恢复数据?
  • 编程的魅力
  • 灵当CRM系统index.php存在SQL注入漏洞
  • 由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(六)
  • 计算机知识包括哪些和应用?
  • 如何通过全面技术方案与灵活商务服务引领实时云渲染的未来?
  • 滚雪球学SpringCloud[6.2讲]: Zipkin:分布式追踪系统详解
  • 30个小米集团芯片工程师岗位面试真题
  • VMware Fusion 虚拟机Mac版 安装CentOS8 系统教程
  • 教你在本地部署AI大模型,效果很赞!
  • GEE教程:对降水数据进行重投影(将10000m分辨率提高到30m)
  • 微信小程序自定义navigationBar顶部导航栏(背景图片)适配所有机型,使用tdesign-miniprogram t-navbar设置背景图片
  • 中国光刻机突破28nm?进步巨大但前路漫漫
  • Go语言并发模式详解:深入理解管道与上下文的高级用法
  • STM32调试TIC12400笔记
  • 大模型之RAG-关键字检索的认识与实战(混合检索进阶储备)
  • 【HTTP】方法(method)以及 GET 和 POST 的区别