为什么 Java 8 中没有布尔控制器?

2022-08-31 20:37:30

恐怕这是一个有点愚蠢的问题。

有没有人能告诉我为什么没有布尔供应商的对立面?BooleanConsumer

除了“因为根本没有”之外,还有什么理由吗?

我应该创建自己的一个吗?还是我错过了别的东西?

public interface BooleanConsumer {

    void accept(boolean value);

    default BooleanConsumer andThen(final BooleanConsumer after) {
        return v -> {
            accept(v);
            after.accept(v);
        }
    }
}

更新

在哪里使用?我正在编写一个使用大量消费者和供应商的库。我成功地写了一行,我遇到了一种情况,期望消费者接受来自方法结果的布尔值。说?LongConsumerFiles.deleteIfExist


答案 1

IntConsumer并且需要避免开销自动装箱每个值。在原始基元上工作要有效得多。但是,对于布尔值和字节,每个可能的对象都被缓存,因此没有理由避免使用LongConsumerConsumer<Boolean>Consumer<Byte>


答案 2

正如其他答案所表明的那样,没有很好的理由来避免,但是也没有很好的理由来避免,因此需要对此做出不同的解释。Consumer<Boolean>Supplier<Boolean>

一个类似的问题是,为什么你不能打开一个值。答案是没有必要,因为您始终可以使用 或 。booleanifif else

A 实际上只不过是一个构造,因为 a 的方法总是可以写成这样的形式:BooleanConsumerif elseaccept()BooleanConsumer

if (v) {
    // Do something
} else {
    // Do something else
}

如果您需要将此类代码作为数据传递,则可以传递一对表示“做某事”和“做其他事”的s。在许多情况下,您只需要其中一个,因为上面的两个块中的一个是空的。RunnableRunnable

同样,不需要 a,因为它只不过是一对 s,也不需要 a,因为它只不过是一对 s。BooleanPredicateBooleanSupplierBooleanFunction<R>Supplier<R>

与此相反,不可能将 a 分解为两个更简单的对象。BooleanSupplier