ToIntFunction インターフェイスを記述した場合、次のように、それがプリミティブな int を返す単なる関数であるという事実をインターフェイスにエンコードしたいと思います。
@FunctionalInterface
public interface ToIntFunction<T> extends Function<T, Integer> {
int applyAsInt(T value);
@Override
default Integer apply(T value) {
return Integer.valueOf(applyAsInt(value));
}
}
私が疑問に思っていたのは、Java 8 API 設計者がプリミティブな代替手段を関数から完全に分離しておくことを選択した説得力のある理由があるのでしょうか? 彼らがそうすることを検討し、それに反対したという証拠はありますか? Consumer (Function<T, Void> の可能性があります) や Supplier (Function<Void, T>) など、他の「特別な」機能インターフェイスの少なくとも一部についても、同様の質問があると思います。
私はこれのすべての影響について非常に深く徹底的に考えていないので、おそらく何かが欠けている.
ToIntFunction (およびその他のプリミティブな汎用関数インターフェイス) が Function とこの関係を持っていた場合、Function パラメーターが期待される場所でそれを使用できるようになります (思いつくのは、myFunction.compose(myIntFunction) の呼び出しなど、他の関数との構成です)。または、上記のような自動 (非) ボックス化の実装で十分な場合に、API にいくつかの特殊な関数を記述することを避けるため)。
これは、この質問と非常によく似ています: Java 8 の Predicate<T> が Function<T, Boolean> を拡張しないのはなぜですか。したがって、関数の単純なプリミティブ代替のこの場合の質問を再定式化しています。セマンティクスはなく、プリミティブとラップされた型だけであり、null ラップされたオブジェクトの可能性さえも排除されます。