2017-02-27 11 views
2

私はJava 8を初めて使用していますが、プリミティブBiConsumer(IntBiConsumerなど)は見つかりませんでしたが、BiFunctionの基本的な特殊化であるToIntBiFunctionがあります。 ToIntBiFunctionと同じIntBinaryOperatorもあります。Java 8にプリミティブBiConsumerがない理由は何ですか?

BiConsumer<Integer,String> wrappedBiConsumer = (i,s) -> System.out.printf("Consume %d %s \n",i,s); 
ToIntBiFunction<String,String> toIntFunction = (a,b) -> a.length()* b.length(); 
  1. OracleはJava8でIntBiConsumerを提供していない理由理由はありますか?
  2. "IntBiFunction"のような1つのインターフェイスを持つ代わりに、 "IntBinaryOperator"と "ToIntBiFunction"のような2つのインターフェイスがあるのはなぜですか? (別の目的を果たすためにそこにいるのであれば、両方とも同じ親IntBiFunctionから拡張することができます)

私はかなりの理由でそれを設計し、plsがそれを理解することを確信しています。

+2

可能なすべての機能インタフェースの組み合わせがプリミティブ型に含まれる場合、可能性の数が爆発的になります。私は彼らが一番役に立つと思ったものを選んだと思う。彼らがそれを含めることができなかった理由は本当に設計上の理由はありません。 – ajb

+2

彼らはそれを必要とするAPIを持っていなかったので、彼らは気にしませんでした。 –

答えて

4

IntBiConsumerを除いた具体的な理由はありませんが、必要な場合には簡単に実装できる@FunctionalInterfaceです。私たちがTriFunctionまたはTriConsumerインターフェイスを持っていないのと同じ理由だと思います。

IntBinaryOperatorToIntBiFunctionを混用しないでください。 1つはタイプ(int, int) -> intの機能であり、後者は(T, U) -> intの機能です。だから後者は最大で(Integer, Integer) -> intになる可能性がありますが、これはパフォーマンスのためにはるか遠いオブジェクト内のプリミティブのボクシングで発生します。 IntBinaryOperatorは、それらをボックス化しないままにします。これは、より多くのパフォーマンスが必要な場合(バイナリint関数の場合もあります)に便利です。

1

実際には、BiConsumerの部分int-specializationであるObjIntConsumerがJavaにあります。したがって、最初の例は次のように書き直すことができます:

ObjIntConsumer<String> consumer = (s, i) -> System.out.printf("Consume %d %s\n", i, s); 
関連する問題