我担心这有点愚蠢。
有没有人可以告诉我为什么BooleanConsumer
与BooleanSupplier
相反?
除了“因为根本没有”,还有其他原因吗?
我应该创建自己的吗?或者我错过了其他什么?
public interface BooleanConsumer {
void accept(boolean value);
default BooleanConsumer andThen(final BooleanConsumer after) {
return v -> {
accept(v);
after.accept(v);
}
}
}
在哪里使用?我正在写一个使用大量消费者和供应商的图书馆。我成功地用LongConsumer
写了一行,我遇到了一种情况,期望消费者接受来自方法结果的布尔值。说Files.deleteIfExist
?
答案 0 :(得分:40)
IntConsumer
和LongConsumer
来避免每个值的开销自动装箱。处理原始基元会更有效率。
但是,对于布尔值和字节,每个可能的对象都被缓存,因此没有理由避免使用Consumer<Boolean>
或Consumer<Byte>
答案 1 :(得分:16)
正如其他答案所示,没有充分的理由可以避免Consumer<Boolean>
,但是没有理由避免Supplier<Boolean>
,因此需要另外的解释。
类似的问题是为什么您无法启用boolean
值。答案是没有必要,因为您始终可以使用if
或if 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>