在番石榴中反向供应商
我正在寻找Guava中Supplier
的反面。 我希望它可以被称为Consumer
– 诺普 – 或者Sink
– 存在,但它是原始价值观。
它隐藏在某处,我想念它吗?
我希望看到它与Supplier
有用的原因相同。 不可否认,用途不太常见,但Suppliers
许多静态方法,例如,将以类似的方式应用,并且在一行中表达诸如“将此供应商的每个值发送给此供应商”这样的事情将是有用的。
与此同时, Predicate
和Function
是丑陋的变通方法。
您的替代方案是:
- Java 8引入了一个可以编写的
Consumer
接口。 - Xtend的标准库包含
Procedures
。 - Scala有
Function*
; 如果函数的返回类型是Unit
,则认为是副作用。
在所有这些语言中,您可以方便地使用function接口,因此您也可以使用例如Functional Java的Effect
。
否则 ,您最好依靠现有的语言结构来执行副作用,例如内置的for
循环。 使用lambdas时,Java <8会造成巨大的语法开销。 看到这个问题和这个讨论 。
你已经找到了答案。 如果您只想访问,可以使用带有始终返回true的谓词的filter; 如果你是超级防御者,你可以使用任何谓词并在filter本身中使用带有alwaysTrue的函数或函数; 只需添加or
最后添加,以避免短路。
问题在于,即使我同意概念谓词和消费者是不同的,因为谓词应该尽可能无状态而没有副作用,而消费者只是副作用,实际上唯一的句法差异是一个返回一个boolean(可以忽略)和另一个void。 如果Guava有一个Consumer,那么它需要复制一些方法,这些方法使Predicate也接受Consumer或者Consumer从Predicateinheritance。