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

时间:2014-12-30 02:34:48

标签: java function java-8

我担心这有点愚蠢。

有没有人可以告诉我为什么BooleanConsumerBooleanSupplier相反?

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

我应该创建自己的吗?或者我错过了其他什么?

public interface BooleanConsumer {

    void accept(boolean value);

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

更新

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

3 个答案:

答案 0 :(得分:40)

需要

IntConsumerLongConsumer来避免每个值的开销自动装箱。处理原始基元会更有效率。 但是,对于布尔值和字节,每个可能的对象都被缓存,因此没有理由避免使用Consumer<Boolean>Consumer<Byte>

答案 1 :(得分:16)

正如其他答案所示,没有充分的理由可以避免Consumer<Boolean>,但是没有理由避免Supplier<Boolean>,因此需要另外的解释。

类似的问题是为什么您无法启用boolean值。答案是没有必要,因为您始终可以使用ifif else

BooleanConsumer实际上只不过是if else构造,因为accept()的{​​{1}}方法总是以这种形式写出来:

BooleanConsumer

如果你需要传递这些代码作为数据,你可以传递一对代表&#34;做某事&#34;的if (v) { // Do something } else { // Do something else } 代码。和&#34;做别的事情&#34;。在许多情况下,您只需要Runnable中的一个,因为上面两个块中的一个是空的。

以同样的方式,不需要Runnable,因为它只不过是一对BooleanPredicate而且不需要aa BooleanSupplier,因为它会只不过是一对BooleanFunction<R> s。

与此相反,不可能将Supplier<R>分成两个更简单的对象。

答案 2 :(得分:8)

您可以编写自己的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");
    }
}

myBooleanFunction返回一个布尔值,但在地图中使用它会创建一个布尔流(因为我们在通用的非原始Stream中。再次,我们有mapToInt,mapToLong,mapToDouble来创建一个IntStream等,但是没有mapToBoolean )。

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