为什么java 8中没有原始的BiConsumer?

时间:2017-02-27 01:39:25

标签: java functional-programming java-8

我是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();
  1. 有没有理由为什么Oracle没有提供带有Java8的IntBiConsumer?
  2. 为什么有两个接口,如“IntBinaryOperator”和“ToIntBiFunction”,而不是像“IntBiFunction”这样的接口? (如果它们用于不同的目的,它们仍然可以从同一个父IntBiFunction扩展)
  3. 我很确定他们以合理的理由设计它,请让我理解它。

2 个答案:

答案 0 :(得分:6)

实际上,Java中有一个ObjIntConsumer,它是BiConsumer的部分专业化。因此,您的第一个示例可以重写为:

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

答案 1 :(得分:5)

我没有看到排除IntBiConsumer背后有任何具体原因,如果您需要,可以轻松实现这一点@FunctionalInterface。我想这与我们没有TriFunctionTriConsumer接口的原因相同。

请勿将IntBinaryOperatorToIntBiFunction混合使用。第一个是(int, int) -> int类型的函数,而后者的格式为(T, U) -> int。所以后者最多只能是(Integer, Integer) -> int,但是这会导致对象中的基元的装箱,这对于高性能而言是远远不够的。相反,IntBinaryOperator会将它们保留为未装箱,这在您需要更高性能时非常有用(对于二进制int函数可能就是这种情况)。