java中的Consumer、Supply如何實現(xiàn)多參數(shù)?
Java的Consumer接口只能接受一個參數(shù),但可以通過自定義接口、使用Tuple或嵌套結構來實現(xiàn)對多個參數(shù)的處理,對于Supplier接口,它不能接受參數(shù),但可以通過自定義BiSupplier、結合Function或封裝參數(shù)為對象來實現(xiàn)對兩個參數(shù)并返回一個值的功能。文章介紹了Java中Consumer和Supplier函數(shù)式接口的使用,以及如何通過自定義接口、使用組合或第三方庫來實現(xiàn)多參數(shù)的類似功能
Consumer如何接受多參數(shù)?
在 Java 中,Consumer
是一個只接受 一個參數(shù) 的函數(shù)式接口,定義在 java.util.function
包中。其主要方法是 accept(T t)
,用于處理傳入的參數(shù)而不返回值。
如果你需要一個可以接受 三個參數(shù) 的類似功能,可以通過以下方式實現(xiàn):
1. 創(chuàng)建自定義的 Consumer 接口
你可以自己定義一個支持三個參數(shù)的 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. 使用三參數(shù)的現(xiàn)成函數(shù)式接口
雖然標準庫中沒有 TriConsumer
,但一些第三方庫(例如 Apache Commons 或 Vavr)中可能提供了類似的功能。這樣你就不需要自己實現(xiàn)。
3. 使用組合 Consumer
解決
如果你堅持使用 Java 自帶的 Consumer
,可以將三個參數(shù)打包成一個對象傳遞。例如:
使用 Consumer
和 Tuple
:
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
是標準庫中支持兩個參數(shù)的函數(shù)式接口。通過嵌套 Consumer
,可以間接實現(xiàn)對三個參數(shù)的操作:
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 如何接受兩個參數(shù)?
在 Java 的標準庫中,Supplier
是一個函數(shù)式接口,用于生成一個結果。它的核心方法是:
T get();
這意味著 Supplier
不接受任何參數(shù),只負責返回一個值。
如果你需要類似 Supplier
接受兩個參數(shù):
Java 的標準庫沒有直接提供這樣一個接口,但你可以通過以下方式實現(xiàn):
1. 自定義一個類似 BiSupplier
的接口
可以創(chuàng)建一個支持兩個輸入?yún)?shù)并返回一個值的接口:
@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
使用
如果你不想創(chuàng)建新接口,可以使用 BiFunction
替代:
BiFunction<String, Integer, String> biFunction = (name, age) -> "Name: " + name + ", Age: " + age; System.out.println(biFunction.apply("Alice", 25)); // 輸出: Name: Alice, Age: 25
雖然它的名字是 BiFunction
,但功能上可以等效于一個接受兩個參數(shù)的 Supplier
。
3. 將參數(shù)封裝為對象
你可以通過將兩個參數(shù)封裝為一個對象,仍然使用標準的 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
本身只能接受一個參數(shù)。對于三個參數(shù),可以自定義 TriConsumer
,使用 Tuple
或嵌套結構。如果需要更強大的函數(shù)式接口支持,考慮引入第三方庫或切換到更高級的解決方案。
Supplier
本身不能接受任何參數(shù),只負責提供一個值。如果需要接受兩個參數(shù)并返回一個值: 自定義 BiSupplier
。使用 BiFunction
替代。封裝參數(shù)為一個對象,繼續(xù)使用標準的 Supplier
。
到此這篇關于java中的Consumer、Supply如何實現(xiàn)多參數(shù)?的文章就介紹到這了,更多相關java中的Consumer、Supply多參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用FeignClient調(diào)用遠程服務時整合本地的實現(xiàn)方法
這篇文章主要介紹了使用FeignClient調(diào)用遠程服務時整合本地的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03Spring Boot實戰(zhàn)之數(shù)據(jù)庫操作的示例代碼
本篇文章主要介紹了Spring Boot實戰(zhàn)之數(shù)據(jù)庫操作的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01