当前位置: 代码网 > it编程>编程语言>Java > java中的Consumer、Supply如何实现多参数?

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

2024年12月02日 Java 我要评论
java的consumer接口只能接受一个参数,但可以通过自定义接口、使用tuple或嵌套结构来实现对多个参数的处理,对于supplier接口,它不能接受参数,但可以通过自定义bisupplier、结

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多参数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com