我是Java 8的新手,我找不到任何原始的BiConsumer(IntBiConsumer等),但是有一个ToIntBiFunction,它是BiFunction的原始特化。还有一个IntBinaryOperator与ToIntBiFunction相同。
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();
我很确定他们以合理的理由设计它,请让我理解它。
答案 0 :(得分:6)
实际上,Java中有一个ObjIntConsumer
,它是BiConsumer
的部分专业化。因此,您的第一个示例可以重写为:
ObjIntConsumer<String> consumer = (s, i) -> System.out.printf("Consume %d %s%n", i, s);
答案 1 :(得分:5)
我没有看到排除IntBiConsumer
背后有任何具体原因,如果您需要,可以轻松实现这一点@FunctionalInterface
。我想这与我们没有TriFunction
或TriConsumer
接口的原因相同。
请勿将IntBinaryOperator
与ToIntBiFunction
混合使用。第一个是(int, int) -> int
类型的函数,而后者的格式为(T, U) -> int
。所以后者最多只能是(Integer, Integer) -> int
,但是这会导致对象中的基元的装箱,这对于高性能而言是远远不够的。相反,IntBinaryOperator
会将它们保留为未装箱,这在您需要更高性能时非常有用(对于二进制int函数可能就是这种情况)。