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,因为这与问题无关。谓词有不同的行为和不同的类型。它会滥用类型系统并导致误解。这是一种攻击。