Java 与供应商相反<;T>;番石榴

Java 与供应商相反<;T>;番石榴,java,functional-programming,guava,Java,Functional Programming,Guava,我在寻找番石榴中供应商的反面。我希望它将被称为消费者——不存在,或者接收器——存在,但用于原始值 是不是藏在什么地方,而我却错过了 我希望看到它的原因与Supplier有用的原因相同。诚然,使用不太常见,但例如,供应商的许多静态方法将以类似的方式应用,用一行文字表达类似于“向供应商发送此iterable中的所有值”的内容会很有用 同时,谓词和函数都是难看的变通方法。您已经找到了答案。如果您只想访问,您可以使用filter和始终返回true的谓词;如果你是超级防御性的,你可以使用任何谓词,并在过滤

我在寻找番石榴中供应商的反面。我希望它将被称为
消费者
——不存在,或者
接收器
——存在,但用于原始值

是不是藏在什么地方,而我却错过了

我希望看到它的原因与
Supplier
有用的原因相同。诚然,使用不太常见,但例如,
供应商
的许多静态方法将以类似的方式应用,用一行文字表达类似于“向供应商发送此iterable中的所有值”的内容会很有用


同时,
谓词
函数
都是难看的变通方法。

您已经找到了答案。如果您只想访问,您可以使用filter和始终返回true的谓词;如果你是超级防御性的,你可以使用任何谓词,并在过滤器本身中使用带有alwaysTrue的or函数;只需在末尾添加
,以避免短路

问题是,尽管我同意概念上的谓词和使用者是不同的,因为谓词应该尽可能无状态,并且没有副作用,而使用者只关心副作用,但在实践中,唯一的语法差异是一个返回布尔值(可以忽略),另一个为空。如果Guava有一个消费者,它需要复制几个接受谓词的方法来也接受消费者,或者让消费者从谓词继承

您的备选方案是:

  • Java8引入了一个您可以使用的接口
  • 的标准库包含
  • 已经;如果函数的返回类型为,则将其视为副作用
在所有这些语言中,您可以方便地使用功能接口,因此您也可以使用例如的


否则,您最好依靠现有的语言结构来执行副作用,例如内置的
for
循环。Java<8在使用lambdas时会造成巨大的语法开销。请参阅和。

您可以使用
函数
并将第二个参数设置为该
函数
只能返回
null

可能没有帮助,但有一个消费者在。。。实际上,您可能正在寻找一个二进制函数,然后可以将其应用于reduce/fold操作。许多基本的统计功能都可以通过这种方式实现(例如,平均值、标准差、总和、最小值、最大值)。这已经在Guava问题列表中提出,但被认为是“太功能化了”。在这种情况下,我不是-我想要一个返回void的一元函数,它接受T。例如,典型的循环:
For(T elem:iterable){sink.consume(elem);}
将被类似
Iterables.apply(iterable,sink)
(或者可能是
消耗品。消费
,等等)。同时,谓词和函数是难看的解决方法。-对于每个循环来说,都是优雅的解决方案(直到Java 8).1@Xaerxess。Guava没有这种功能的主要原因是我们没有令人信服的用例:就我们所知,在Java 7中,直接编写此类代码通常更干净,而不使用对象封装回调。问题是,实现这种功能的类是命名类、通用类和让他们实现Predicate always returns true会让人困惑。你可以等效地说Supplier是无用的——你也可以使用函数,忽略输入。请注意Iterables.filter()是惰性的,所以“Predicate”在您实际迭代生成的Iterable之前,不会调用consumer,这非常难看,可能会导致bug……您需要编写类似于
Lists.newArrayList(Iterables.filter(Iterable,谓词ethatisActuallyConsumer))的内容;
。我宁愿使用for循环和特定于项目的
使用者类。-1,因为这与问题无关。谓词有不同的行为和不同的类型。它会滥用类型系统并导致误解。这是一种攻击。