java中的Consumer、Supply如何实现多参数?

 更新时间:2024年11月30日 15:52:40   作者:魔道不误砍柴功  
Java的Consumer接口只能接受一个参数,但可以通过自定义接口、使用Tuple或嵌套结构来实现对多个参数的处理,对于Supplier接口,它不能接受参数,但可以通过自定义BiSupplier、结合Function或封装参数为对象来实现对两个参数并返回一个值的功能

Java的Consumer接口只能接受一个参数,但可以通过自定义接口、使用Tuple或嵌套结构来实现对多个参数的处理,对于Supplier接口,它不能接受参数,但可以通过自定义BiSupplier、结合Function或封装参数为对象来实现对两个参数并返回一个值的功能。文章介绍了Java中Consumer和Supplier函数式接口的使用,以及如何通过自定义接口、使用组合或第三方库来实现多参数的类似功能

Consumer如何接受多参数?

在 Java 中,Consumer 是一个只接受 一个参数 的函数式接口,定义在 java.util.function 包中。其主要方法是 accept(T t),用于处理传入的参数而不返回值。

如果你需要一个可以接受 三个参数 的类似功能,可以通过以下方式实现:

1. 创建自定义的 Consumer 接口

你可以自己定义一个支持三个参数的 Consumer

@FunctionalInterface
public interface TriConsumer<T, U, V> {
    void accept(T t, U u, V v);
}

使用示例:

TriConsumer<String, Integer, Boolean> triConsumer = (name, age, isActive) -> {
    System.out.println("Name: " + name);
    System.out.println("Age: " + age);
    System.out.println("Active: " + isActive);
};

triConsumer.accept("Alice", 25, true);

2. 使用三参数的现成函数式接口

虽然标准库中没有 TriConsumer,但一些第三方库(例如 Apache Commons 或 Vavr)中可能提供了类似的功能。这样你就不需要自己实现。

3. 使用组合 Consumer 解决

如果你坚持使用 Java 自带的 Consumer,可以将三个参数打包成一个对象传递。例如:

使用 ConsumerTuple

class Tuple3<T, U, V> {
    final T first;
    final U second;
    final V third;

    public Tuple3(T first, U second, V third) {
        this.first = first;
        this.second = second;
        this.third = third;
    }
}

Consumer<Tuple3<String, Integer, Boolean>> consumer = tuple -> {
    System.out.println("Name: " + tuple.first);
    System.out.println("Age: " + tuple.second);
    System.out.println("Active: " + tuple.third);
};

consumer.accept(new Tuple3<>("Bob", 30, false));

4. 使用 BiConsumer 和嵌套

BiConsumer 是标准库中支持两个参数的函数式接口。通过嵌套 Consumer,可以间接实现对三个参数的操作:

BiConsumer<String, Integer> biConsumer = (name, age) -> {
    Consumer<Boolean> innerConsumer = isActive -> {
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
        System.out.println("Active: " + isActive);
    };
    innerConsumer.accept(true);
};

biConsumer.accept("Charlie", 28);

参考代码

@Override
    public List<CsAIAppConfig> doGenerateDefaultAI(AIServiceSettingDTO aiServiceSetting) {
        List<CsAIAppConfig> aiConfigOfList = new ArrayList<>();

        // 定义一个通用方法来构建并生成AI配置
        BiConsumer<String, AIEnableEnum> createAIConfig =
                (modelId, enableEnum) -> Optional.ofNullable(modelId).ifPresent(id -> {
                    SaveOrUpdateAIEntity build = SaveOrUpdateAIEntity.builder()
                            .targetId("DEFAULT")
                            .modelId(id)
                            .aiEnableEnum(enableEnum)
                            .knowledge(getKnowledgeByEnum(enableEnum, aiServiceSetting))
                            .csAIAppConfigs(aiServiceSetting.getCsAIAppConfigs())
                            .build();
                    generateAI(build, aiConfigOfList);
                });

        // 构建各类AI配置
        createAIConfig.accept(aiServiceSetting.getWorkOrderModelId(), AIEnableEnum.CS_WORK_ORDER_AI_ENABLE);
        createAIConfig.accept(aiServiceSetting.getWxKfModelId(), AIEnableEnum.CS_WX_KF_AI_ENABLE);
        createAIConfig.accept(aiServiceSetting.getZxKfModelId(), AIEnableEnum.CS_ZX_KF_AI_ENABLE);
        createAIConfig.accept(aiServiceSetting.getMhKhModelId(), AIEnableEnum.CS_MH_KH_AI_ENABLE);

        return aiConfigOfList;
    }

Supply 如何接受两个参数?

在 Java 的标准库中,Supplier 是一个函数式接口,用于生成一个结果。它的核心方法是:

T get();

这意味着 Supplier 不接受任何参数,只负责返回一个值。

如果你需要类似 Supplier 接受两个参数:

Java 的标准库没有直接提供这样一个接口,但你可以通过以下方式实现:

1. 自定义一个类似 BiSupplier 的接口

可以创建一个支持两个输入参数并返回一个值的接口:

@FunctionalInterface
public interface BiSupplier<T, U, R> {
    R get(T t, U u);
}

使用示例:

BiSupplier<String, Integer, String> biSupplier = (name, age) -> 
    "Name: " + name + ", Age: " + age;

System.out.println(biSupplier.get("Alice", 25)); // 输出: Name: Alice, Age: 25

2. 结合 Function 使用

如果你不想创建新接口,可以使用 BiFunction 替代:

BiFunction<String, Integer, String> biFunction = (name, age) -> 
    "Name: " + name + ", Age: " + age;

System.out.println(biFunction.apply("Alice", 25)); // 输出: Name: Alice, Age: 25

虽然它的名字是 BiFunction,但功能上可以等效于一个接受两个参数的 Supplier

3. 将参数封装为对象

你可以通过将两个参数封装为一个对象,仍然使用标准的 Supplier

class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Name: " + name + ", Age: " + age;
    }
}

Supplier<Person> personSupplier = () -> new Person("Alice", 25);

System.out.println(personSupplier.get()); // 输出: Name: Alice, Age: 25

总结

Java 的 Consumer 本身只能接受一个参数。对于三个参数,可以自定义 TriConsumer,使用 Tuple 或嵌套结构。如果需要更强大的函数式接口支持,考虑引入第三方库或切换到更高级的解决方案。

Supplier 本身不能接受任何参数,只负责提供一个值。如果需要接受两个参数并返回一个值: 自定义 BiSupplier。使用 BiFunction 替代。封装参数为一个对象,继续使用标准的 Supplier

到此这篇关于java中的Consumer、Supply如何实现多参数?的文章就介绍到这了,更多相关java中的Consumer、Supply多参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • tk.mybatis扩展通用接口使用详解

    tk.mybatis扩展通用接口使用详解

    这篇文章主要介绍了tk.mybatis扩展通用接口使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 基于Java NIO编写一个简单版Netty服务端

    基于Java NIO编写一个简单版Netty服务端

    基于 NIO 实现的网络框架,可以用少量的线程,处理大量的连接,更适用于高并发场景,所以被就将利用NIO编写一个简单版Netty服务端,需要的可以参考下
    2024-04-04
  • Maven的聚合(多模块)和Parent继承

    Maven的聚合(多模块)和Parent继承

    今天小编就为大家分享一篇关于Maven的聚合(多模块)和Parent继承,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • SpringMVC + jquery.uploadify实现上传文件功能

    SpringMVC + jquery.uploadify实现上传文件功能

    文件上传是很多项目都会使用到的功能,SpringMVC当然也提供了这个功能。不过小编不建议在项目中通过form表单来提交文件上传,这样做的局限性很大。下面这篇文章主要介绍了利用SpringMVC + jquery.uploadify实现上传文件功能的相关资料,需要的朋友可以参考下。
    2017-06-06
  • 如何在java中使用SFTP协议安全的传输文件

    如何在java中使用SFTP协议安全的传输文件

    这篇文章主要介绍了如何在java中使用SFTP协议安全的传输文件,帮助大家更好的理解和使用JSch,感兴趣的朋友可以了解下
    2020-10-10
  • SpringMVC上传文件的两种方法

    SpringMVC上传文件的两种方法

    这篇文章主要为大家详细介绍了SpringMVC上传文件的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • 五种JAVA GUI布局管理的方式

    五种JAVA GUI布局管理的方式

    这篇文章主要介绍了JAVA几种GUI布局管理的相关知识,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 解决Shiro 处理ajax请求拦截登录超时的问题

    解决Shiro 处理ajax请求拦截登录超时的问题

    这篇文章主要介绍了解决Shiro 处理ajax请求拦截登录超时的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Spring Boot中配置定时任务、线程池与多线程池执行的方法

    Spring Boot中配置定时任务、线程池与多线程池执行的方法

    这篇文章主要给大家介绍了关于Spring Boot中配置定时任务、线程池与多线程池执行的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • 一篇文章告诉你如何在Java数组中插入一个字符

    一篇文章告诉你如何在Java数组中插入一个字符

    本篇文章主要介绍了Java数组中插入一个字符的相关方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-10-10

最新评论