为什么在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
?
IntConsumer
和LongConsumer
是需要避免开销自动装箱每个值。 在原始图元上工作要高效得多。 但是,对于Boolean和Byte,所有可能的对象都被caching,所以没有必要避免使用Consumer<Boolean>
或Consumer<Byte>
正如其他答案指出,避免使用Consumer<Boolean>
没有很好的理由,但是避免Supplier<Boolean>
也没有很好的理由,所以需要不同的解释。
类似的问题是为什么你不能打开一个boolean
值。 答案是没有必要,因为你总是可以使用if
或if else
。
一个BooleanConsumer
实际上只不过是一个if else
结构,因为一个BooleanConsumer
的accept()
方法总是可以这样写:
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接口。