为什么Java8中没有布尔消费者?

为什么Java8中没有布尔消费者?,java,function,java-8,Java,Function,Java 8,恐怕这是个有点傻的问题 有人能告诉我为什么没有与之相对的布尔消费者吗 除了“因为根本就没有”之外,还有其他原因吗 我应该创建自己的吗?还是我错过了什么 公共接口布尔消费者{ 无效接受(布尔值); 默认BooleanConsumer和THEN(后面的最终BooleanConsumer){ 返回v->{ 接受(v); 之后,接受(v); } } } 更新 在哪里使用?我正在写一个图书馆,它使用了很多消费者和供应商。我成功地用LongConsumer编写了一行代码,并且遇到了一种情况,即希望消费者接

恐怕这是个有点傻的问题

有人能告诉我为什么没有与之相对的
布尔消费者吗

除了“因为根本就没有”之外,还有其他原因吗

我应该创建自己的吗?还是我错过了什么

公共接口布尔消费者{
无效接受(布尔值);
默认BooleanConsumer和THEN(后面的最终BooleanConsumer){
返回v->{
接受(v);
之后,接受(v);
}
}
}
更新
在哪里使用?我正在写一个图书馆,它使用了很多消费者和供应商。我成功地用
LongConsumer
编写了一行代码,并且遇到了一种情况,即希望消费者接受来自方法结果的布尔值。说
Files.deleteIfExist

您可以编写自己的BooleanConsumer,但为了使其真正有用,您还需要编写自己的BooleanStream。有IntStream、LongStream和DoubleStream,但没有“BooleanStream”(或“ShortStream”、“FloatStream”等)。看来这些原语被认为不够重要

您可以始终使用布尔对象而不是布尔基元,并使用布尔使用者来使用这些值。示例代码:

public class Main {
    public static void main(String[] args) {
        Consumer<Boolean> myConsumer = b -> System.out.println("b = " + b);

        Stream.of("aa", "bb", "cc")
                .map(Main::myBooleanFunction)
                .forEach(myConsumer);

    }

    static boolean myBooleanFunction(String s) {
        return s.startsWith("b");
    }
}
公共类主{
公共静态void main(字符串[]args){
消费者myConsumer=b->System.out.println(“b=“+b”);
“aa”、“bb”、“cc”流
.map(Main::MyBoolean函数)
.forEach(消费者);
}
静态布尔myBooleanFunction(字符串s){
返回s.startsWith(“b”);
}
}
myBooleanFunction返回一个布尔值,但在映射中使用它会创建一个布尔值流(因为我们在通用的非基本流中。同样,我们有mapToInt、mapToLong、mapToDouble来创建IntStream等,但没有mapToBoolean)


如果您不需要流支持,您仍然可以编写并使用“BooleanConsumer”来为某些行为提供类型,换句话说,我更希望看到一个具有更具体和描述性名称的功能接口。

其他答案表明,没有很好的理由避免
Consumer
,但是也没有很好的理由避免供应商,因此需要对此进行不同的解释

类似的问题是,为什么不能打开
布尔值。答案是没有必要,因为您可以始终使用
if
if-else

BooleanConsumer
实际上只不过是一个
if-else
构造,因为
BooleanConsumer
accept()
方法始终可以用以下形式编写:

if (v) {
    // Do something
} else {
    // Do something else
}
如果需要将这些代码作为数据传递,只需传递一对表示“做某事”和“做其他事情”的
Runnable
s即可。在许多情况下,您只需要一个
Runnable
s,因为上面两个块中的一个是空的

同样,不需要
布尔谓词
,因为它只不过是一对
布尔供应商
s,也不需要
布尔函数
,因为它只不过是一对
供应商
s


与此相反,不可能将
布尔供应商
分解为两个更简单的对象

IntConsumer
LongConsumer
需要避免开销自动装箱每个值。处理原始原语要有效得多。
但是,对于布尔值和字节,每个可能的对象都被缓存,因此几乎没有理由避免使用
消费者
消费者

在哪里使用布尔消费者?为了它的价值,也没有
布尔谓词
布尔函数
。另一个方面是,对于
消费者
来说,总是有一个棘手的问题“我是否必须检查null”,因为
布尔
有时会将(ab)用作三态值。对于
BooleanConsumer
,就不会有这样的担心了。但是你需要处理两项而不是一项。如果你有一个不是更方便吗?同样地,为什么我们需要一个
布尔供应商
?似乎有些牵强。被否决的答案是误导性的。是的,
如果
是一个用例,但通常情况下,它是关于赋值的(想想布尔属性,只需在实际查看任何值之前计算其移动的位置)。装箱和拆箱会增加一些计算开销,即使没有对象分配,而且对象也需要比原语更多的内存。这个答案也不能解释为什么没有“CharConsumer”。你所说的“对象兴高采烈”是什么意思?(我从没听说过,谷歌也没听说过…。@lbalazscs在java中它是escape分析的一个功能。它将对象放在堆栈上,而不是在堆上分配对象。这个词应该是elision,就像锁elision一样。@lbalazscs我相信原语使用者在那里是为了支持一个API,它有额外的方法,比如sum,min,max@lbalazscs回复延迟,但请查看
Byte
的源代码,内部类
ByteCache
:它包含每个字节值的“预装箱”单例。当一个字节被“自动装箱”时,它调用
byte.valueOf
(获取缓存对象)而不是
newbyte()
,从而避免任何动态内存分配。有太多的
Int
s和
Long
s无法对每个值执行相同的技巧,但对于0左右的一个小的常用子范围,仍然可以执行相同的技巧。