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

4

我刚接触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
如果他们将所有可能的基本类型和函数接口的组合都包含进去,那么可能性的数量会激增。我认为他们只选择了他们认为最有用的。实际上,并没有设计上的限制阻止他们加入更多的组合方式。 - ajb
2
他们没有需要它的API,所以他们没有费心去做。 - Louis Wasserman
顺便说一句,我创建了一个可从Maven Central获取的软件包,其中包含几乎您想要的每个变体,例如IntBiConsumer - com.mastfrog:function - javadoc在此处:https://timboudreau.com/builds/job/mastfrog-parent/lastSuccessfulBuild/artifact/util/function/target/apidocs/index.html - Tim Boudreau
2个回答

8
实际上,在Java中有一个名为ObjIntConsumer的类,它是BiConsumer的部分int特化。因此,您的第一个示例可以改写为:
ObjIntConsumer<String> consumer = (s, i) -> System.out.printf("Consume %d %s%n", i, s);

5

我认为没有任何特定的原因来排除IntBiConsumer,它是一个琐碎的@FunctionalInterface,如果需要的话,你可以轻松地实现它。我猜这也是我们没有 TriFunctionTriConsumer 接口的原因。

不要混淆IntBinaryOperatorToIntBiFunction。前者是类型为(int, int) -> int的函数,而后者的形式为(T, U) -> int。因此,后者最多只能是(Integer,Integer) -> int,但这会将原始类型装箱成对象,这远非高效。相反,IntBinaryOperator 保持它们未经包装,这在需要更高性能时非常有用(这可能是二进制整数函数的情况)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接