我在找番石榴的Supplier<T>
的反面。我希望它会被称为Consumer
- nope - 或Sink
- 存在,但是用于原始值。反向供应商<T>番石榴
它隐藏在某个地方,我很想念它吗?
我想看到它出于Supplier
有用的相同种类的原因。不可否认,使用不太常见,但例如,Suppliers
的许多静态方法将以类似的方式应用,并且用一行表示“在此迭代中向此供应商发送每个值”是有用的。
与此同时,Predicate
和Function<T,Void>
是丑陋的解决方法。
我在找番石榴的Supplier<T>
的反面。我希望它会被称为Consumer
- nope - 或Sink
- 存在,但是用于原始值。反向供应商<T>番石榴
它隐藏在某个地方,我很想念它吗?
我想看到它出于Supplier
有用的相同种类的原因。不可否认,使用不太常见,但例如,Suppliers
的许多静态方法将以类似的方式应用,并且用一行表示“在此迭代中向此供应商发送每个值”是有用的。
与此同时,Predicate
和Function<T,Void>
是丑陋的解决方法。
你的选择是:
在所有这些语言中,您都可以方便地使用功能界面,因此您还可以使用例如Functional Java的Effect
。
否则,您最好依靠现有的语言构造来执行副作用,例如,内置for
循环。当使用lambdas时,Java会造成巨大的语法开销。见this question和this discussion。
您已经找到答案。如果你只是想访问,你可以使用一个谓词总是返回true的过滤器;如果你是超级防御性的,你可以使用任何谓词,并在过滤器本身中使用带有alwaysTrue的函数或函数;最后加上or
以避免短路。
问题是,即使我同意概念上谓词和消费者是不同的,因为谓词应该尽可能无状态,没有副作用,而消费者只是副作用,实际上唯一的语法差异是那个返回一个布尔值(可以忽略),另一个void。如果Guava拥有一个消费者,那么它需要重复几个采用Predicate的方法来接受消费者或让消费者继承Predicate。
的问题是,将实现这个类的名字,通用类和让他们实现谓语总是-returns-true会令人困惑。你可以等价地争辩说供应商
请注意,Iterables.filter()是懒惰的,所以只有在实际迭代所产生的Iterable时,才会调用“Predicate”消费者,这很丑陋,可能导致错误...您需要编写一些东西像'Lists.newArrayList(Iterables.filter(iterable,predicateThatIsActuallyAConsumer));'。我宁愿使用for循环,也不要使用特定于项目的'Consumer'类。 –
-1因为这不会导致问题。谓词具有不同的行为和不同的类型。它会滥用类型系统并导致误解。这是一个黑客。 – Dibbeke
可能没有帮助,但有一个消费者 ... Java 8. –
您可能实际上正在寻找一个二进制函数,然后可以应用它来减少/折叠操作。许多基本的统计函数可以这种方式实现(例如avg,stddev,sum,min,max)。这是在番石榴问题清单中提出的,但被认为“功能太强大”。 – Dibbeke
在这种情况下我不是 - 我希望有一个一元函数返回void,接受T. 例如,典型的循环: '为(T ELEM:迭代){ 水槽。消耗(ELEM); }' 将由像'Iterables.apply(可迭代,水槽)'(或者'Consumables.consume'等)来代替。 – BeeOnRope