簡體   English   中英

BiFunction 接口中的 compose 方法會是什么樣子?

[英]What would a compose method in the BiFunction interface look like?

Function接口有compose()andThen()方法,而BiFunction接口只有andThen()方法。 我的問題只是如何實現相應的方法? 我將嘗試以圖形方式表示這一點。

沒有 compose 的 BiFunction

單個字母是由 Java 的FunctionBiFunction接口定義的參數化類型。 箭頭是輸入和輸出的流向。 帶有連接箭頭的框是函數。 虛線框僅顯示如何使用 apply 方法。

FunctionCompose()andThen()方法很簡單,因為Function有一個輸入和一個 output,因此只能以兩種方式與另一個按順序串聯。

由於BiFunction有一個 output,“之后”function 必須是只有一個對應輸入的東西,而Function符合要求。 因為它有兩個輸入,所以“之前”的 function 需要有兩個輸出嗎? 你不能讓一個方法返回兩個東西,所以似乎不能有一個“之前”。 這些方法中的每一個的返回類型都與它們在其中定義的接口相同,因此建議的方法應該返回一個BiFunction

那么我的建議是一種將兩個Function作為輸入並返回一個BiFunction的方法。 我不確定它還能是什么。 它不能是兩個BiFunction ,因為返回類型必須是QuaterFunction

這是將在 Java 庫中編寫的代碼:

public interface BiFunction<T, U, R> {
    // apply()...

    default <V, W> BiFunction<V, W, R> compose(
        Function<? super V, ? extends T> beforeLeft,
        Function<? super W, ? extends U> beforeRight) {
        
        Objects.requireNonNull(beforeLeft);
        Objects.requireNonNull(beforeRight);
        return (V v, W w) -> apply(beforeLeft.apply(v), beforeRight.apply(w));
    }

    // andThen()...
}

這是完成的圖表:

在此處輸入圖像描述

這是在使用中:

BiFunction<Integer, Integer, Integer> add = Integer::sum;
Function<Integer, Integer> abs = Math::abs;
BiFunction<Integer, Integer, Integer> addAbs = add.compose(abs, abs);
System.out.println(addAbs.apply(-2, -3));

// output: 5

如果你想實際測試這個,你可以這樣做:

public interface BiFunctionWithCompose<T, U, R> extends BiFunction<T, U, R> {...

或者像這樣:

package myutil;
public interface BiFunction<T, U, R> extends java.util.function.BiFunction<T, U, R> {...

我不知道這是否對任何人都有用,但思考和寫作真的很有趣。 祝你有美好的一天。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM