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

常用函数式接口的使用

@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 -> {
            // dept
            rule.addDeptColumn("dept", "id");
            // user
            rule.addUserColumn("user", "id");
        };
    }

    // 相当于下面的写法(为了方便理解)
    public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer2() {
        DeptDataPermissionRuleCustomizer customizer = new DeptDataPermissionRuleCustomizer() {
            @Override
            public 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.kler.cn/news/312221.html

相关文章:

  • 3D GS 测试自己的数据
  • react 甘特图之旅
  • C语言 | Leetcode C语言题解之第405题数字转换为十六进制数
  • SpringBoot 数据库表结构文档生成
  • 深入Redis:核心的缓存
  • 【计算机网络 - 基础问题】每日 3 题(十四)
  • 百易云资产系统 house.save.php SQL注入
  • tomcat知识
  • 【Android】ViewPager
  • 生信初学者教程(三):介绍
  • [Linux] 进程优先级 进程的调度与切换 环境变量详解
  • qt--Qml控件库如何从外部导入
  • 虾皮选品技巧有哪些?超全Shopee选品的方法和技巧分享!
  • C#无标题栏窗体拖动
  • 物联网开发+充电桩管理系统+充电桩系统源码
  • 【北京迅为】《STM32MP157开发板使用手册》- 第四十二章 事件实验
  • Java设计模式—面向对象设计原则(四) ----->接口隔离原则(ISP) (完整详解,附有代码+案例)
  • 基于JavaWeb开发的java+Springboot操作系统教学交流平台详细设计实现
  • 探索AI大模型的未来:电信运营商与云服务商的新征途@附58页PDF文件下载
  • liunx 计划任务
  • VRRP协议原理
  • 《计算机网络名词解释》
  • 【Python报错已解决】ModuleNotFoundError: No module named ‘paddle‘
  • 量化交易软件、接口、API、区别、用法,有什么好用的么
  • Vue2中路由的介绍和使用
  • UDS诊断-面试题2
  • 掌握Protobuf精髓:深入解析.proto文件语法及高效应用
  • 蓝桥杯4. Fizz Buzz 经典问题
  • sql基础语法及常见函数等
  • 解决:The play() request was interrupted by a call to pause().报错