2013-02-05 24 views
16

我在找番石榴的Supplier<T>的反面。我希望它会被称为Consumer - nope - 或Sink - 存在,但是用于原始值。反向供应商<T>番石榴

它隐藏在某个地方,我很想念它吗?

我想看到它出于Supplier有用的相同种类的原因。不可否认,使用不太常见,但例如,Suppliers的许多静态方法将以类似的方式应用,并且用一行表示“在此迭代中向此供应商发送每个值”是有用的。

与此同时,PredicateFunction<T,Void>是丑陋的解决方法。

+5

可能没有帮助,但有一个消费者 ... Java 8. –

+0

您可能实际上正在寻找一个二进制函数,然后可以应用它来减少/折叠操作。许多基本的统计函数可以这种方式实现(例如avg,stddev,sum,min,max)。这是在番石榴问题清单中提出的,但被认为“功能太强大”。 – Dibbeke

+0

在这种情况下我不是 - 我希望有一个一元函数返回void,接受T. 例如,典型的循环: '为(T ELEM:迭代){ 水槽。消耗(ELEM); }' 将由像'Iterables.apply(可迭代,水槽)'(或者'Consumables.consume'等)来代替。 – BeeOnRope

回答

8

你的选择是:

在所有这些语言中,您都可以方便地使用功能界面,因此您还可以使用例如Functional JavaEffect

否则,您最好依靠现有的语言构造来执行副作用,例如,内置for循环。当使用lambdas时,Java会造成巨大的语法开销。见this questionthis discussion

-2

您已经找到答案。如果你只是想访问,你可以使用一个谓词总是返回true的过滤器;如果你是超级防御性的,你可以使用任何谓词,并在过滤器本身中使用带有alwaysTrue的函数或函数;最后加上or以避免短路。

问题是,即使我同意概念上谓词和消费者是不同的,因为谓词应该尽可能无状态,没有副作用,而消费者只是副作用,实际上唯一的语法差异是那个返回一个布尔值(可以忽略),另一个void。如果Guava拥有一个消费者,那么它需要重复几个采用Predicate的方法来接受消费者或让消费者继承Predicate。

+0

的问题是,将实现这个类的名字,通用类和让他们实现谓语总是-returns-true会令人困惑。你可以等价地争辩说供应商是无用的 - 你可能会使用功能,忽略输入。 – BeeOnRope

+3

请注意,Iterables.filter()是懒惰的,所以只有在实际迭代所产生的Iterable时,才会调用“Predicate”消费者,这很丑陋,可能导致错误...您需要编写一些东西像'Lists.newArrayList(Iterables.filter(iterable,predicateThatIsActuallyAConsumer));'。我宁愿使用for循环,也不要使用特定于项目的'Consumer'类。 –

+5

-1因为这不会导致问题。谓词具有不同的行为和不同的类型。它会滥用类型系统并导致误解。这是一个黑客。 – Dibbeke