2017-02-27 28 views
2

我是Java 8的新手,我找不到任何原始的BiConsumer(IntBiConsumer等),但是有一個ToIntBiFunction,它是BiFunction的原始特化。還有一個IntBinaryOperator與ToIntBiFunction相同。爲什麼在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. 有爲什麼甲骨文沒有提供Java8一個IntBiConsumer任何理由?
  2. 爲什麼有兩個接口像「IntBinaryOperator」和「ToIntBiFunction」而不是像「IntBiFunction」這樣的接口? (如果他們在那裏爲不同的目的,仍然可以從同一個父IntBiFunction擴展)

我非常確定他們設計它的方式有一個很好的理由,請讓我理解它。

+2

如果它們包括與原始類型的功能接口,所有可能的組合,可能性的數量會爆炸。我認爲他們只是選擇了他們認爲最有用的那些。爲什麼他們不能包含它,真的沒有設計理由。 – ajb

+2

他們沒有需要它的API,所以他們沒有打擾。 –

回答

4

我沒有看到排除IntBiConsumer的任何具體原因,這是一個簡單的@FunctionalInterface,你可以很容易地實現,如果你需要它。我想這就是我們沒有TriFunctionTriConsumer接口的原因。

請勿混用IntBinaryOperatorToIntBiFunction。第一種是(int, int) -> int類型的函數,而後者的形式是(T, U) -> int。所以後者最多可以是(Integer, Integer) -> int,但是這會導致對象中的基元被裝箱,這是遠遠不夠的。 IntBinaryOperator取而代之的是讓它們保持無箱狀態,當你需要更多的性能時(這對於二進制int函數來說可能是這種情況)這非常有用。

1

實際上,Java中有一個ObjIntConsumer,它是BiConsumer的部分整型專業化。所以,你的第一個例子可以寫成:

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