亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有可從方法調用的三個參數的 Java 函數

具有可從方法調用的三個參數的 Java 函數

HUH函數 2023-03-09 16:55:41
我有這種調用多個 API 并聚合所有結果并將它們返回到 Map 中的方法,其中每組結果都與目標 API 匹配,以便它們可以在服務中正確分組和顯示。public AggregateResults search(QueryParams params) {    Stream<APITarget> targets = params.getTargets().parallelStream();    Function<APITarget, APIResults> func = (APITarget target) -> {        if (params.length() >= MIN_LENGTH) {           switch (target) {               case api1:                    return searchAPI1(params);               case api2:                   return searchAPI2(params);               .               .               case apin:                    return searchAPIn(params);            }        }        return new APIResults.Builder().build();    };    Map<APITarget, APIResults> results = targets.collect(Collectors.toMap(t -> t, func));    return AggregateResults;}我現在必須重構此代碼,以便例如可以在一個函數中調用 API 1 - 3,然后可以從另一個函數調用 API 4 - N。這些函數將從不同的方法調用,因此我需要將此函數移出此方法,然后將 QueryParams 對象作為另一個參數傳遞給函數,但隨后我遇到了函數無法接受的問題超過一個參數。例如Function<APITarget, APIResults> exampleFunc = (APITarget target, QueryParams params) -> {    if (params.length() >= MIN_LENGTH) {        switch (target) {            case api1:                return searchAPI1(params);            case api2:                return searchAPI2(params);                    }    }    return new APIResults.Builder().build();};我在這里看到過類似的東西:Java lambda 可以有多個參數嗎? 但是 BiFunctions 的示例僅顯示它們被用作 lambda,因此在被外部方法調用時不會起作用,據我所知。此外,當它談到創建一個新的 FunctionalInterface 時,我不確定究竟需要什么才能在我需要的功能中使用新接口。任何想法都會很棒。
查看完整描述

2 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

修改以反映示例


首先,定義一些必需的BiFunction



  BiFunction<Integer, int[], Integer> func = (a, b) ->

      {

         for (int i = 0; i < b.length; i++) {

            a *= b[i];

         }

         return Integer.valueOf(a);

      };



現在定義一些數據。


      //Stream source

      int[] data = { 10, 20, 30

      };

      // parameter source

      int[] params = { 3, 5, 11

      };

      Convert data to stream

      IntStream targets = Arrays.stream(data);

現在應用映射函數。



     Map<Integer, Integer> results = targets.boxed().collect(

            Collectors.toMap(t -> t, t -> func.apply(t, params)));

      System.out.println(results);

上面的代碼獲取stream并創建一個映射,其中的數據充當該數據,keys然后獲取這些相同的鍵并將它們應用于參數列表的功能。這成為地圖的價值。


根據初始流類型,您可能需要使用mapToObj或map代替上述方法。boxed()


查看完整回答
反對 回復 2023-03-09
?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

功能接口(簡單來說)是具有一種方法的接口。


您可能想要注釋接口以@FunctionalInterface記錄其用途,并確保沒有人意外添加其他方法。


方法的名稱并不重要,但當然應該適合它應該做的事情。


因此,如果您需要一個具有 3 個參數的函數,請創建您自己的函數接口。您可以使用泛型類型參數使其具體化或通用化。


@FunctionalInterface

interface TripleString {

    String doStringOp(String a, String b, String c);

}


@FunctionalInterface

interface TriFunction<T, U, V, R> {

    R apply(T t, U u, V v);

}


查看完整回答
反對 回復 2023-03-09
  • 2 回答
  • 0 關注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號