为什么在Java 8中没有BooleanConsumer?

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

有没有人可以告诉我为什么没有BooleanSupplier BooleanConsumer

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

我应该创build一个自己的? 还是我错过了别的?

 public interface BooleanConsumer { void accept(boolean value); default BooleanConsumer andThen(final BooleanConsumer after) { return v -> { accept(v); after.accept(v); } } } 

更新

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

IntConsumerLongConsumer是需要避免开销自动装箱每个值。 在原始图元上工作要高效得多。 但是,对于Boolean和Byte,所有可能的对象都被caching,所以没有必要避免使用Consumer<Boolean>Consumer<Byte>

正如其他答案指出,避免使用Consumer<Boolean>没有很好的理由,但是避免Supplier<Boolean>也没有很好的理由,所以需要不同的解释。

类似的问题是为什么你不能打开一个boolean值。 答案是没有必要,因为你总是可以使用ifif else

一个BooleanConsumer实际上只不过是一个if else结构,因为一个BooleanConsumeraccept()方法总是可以这样写:

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

如果你需要传递这样的代码作为数据,你可以传递一对Runnable代表“做某事”和“做其他事情”。 在很多情况下,你只需要Runnable的一个,因为上面两个块之一是空的。

以同样的方式,不需要一个BooleanPredicate因为它不过是一对BooleanSupplier并且不需要一个BooleanFunction<R>因为它只不过是一对Supplier<R> s 。

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

您可以编写自己的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返回一个布尔值,但在地图中使用它会创build一个布尔stream(因为我们在通用的,非原始的Stream中)。同样,我们有mapToInt,mapToLong,mapToDouble创build一个IntStream等,但没有mapToBoolean)。

如果你不需要stream支持,你仍然可以编写和使用“BooleanConsumer”来为某些行为提供一个types,我宁愿看到具有更具体和描述性名称的function接口。