【发布时间】:2012-09-07 18:05:03
【问题描述】:
我只是想知道在Iterable/Collection 上应用返回Void 的函数的最佳方法是什么?
我的用例是:
- 我有一个
Animal对象列表 - 我想对列表中的每个动物调用
eat()函数
我有一个Function<Animal,Void>,它调用input.eat();
原来当我打电话时:
Collections2.transform(animalList,eatFunction);
我不觉得这很优雅,因为我不是在寻找转换,而只是寻找没有任何输出的应用程序。 最糟糕的是,它甚至不起作用,因为 Guava 转换正在返回视图。
效果很好的是:
Lists.newArrayList( Collections2.transform(animalList,eatFunction) );
但这并不优雅。 使用 Guava 以函数方式将 Void 函数应用于 Iterable/Collection 的最佳方法是什么?
编辑:
- 相关问题:Inverse of Supplier<T> in Guava
- 正如 Dzik 指出的那样,如果您使用 Java8 而不是 Guava,则有 Consumer 类:https://stackoverflow.com/a/32222080/82609
【问题讨论】:
-
只需执行传统的 for-each 循环并调用
animal.eat()?如果你不需要懒惰,不变形,那就根本不要使用 Guava 的变形。 -
我不想使用转换,这是我所要求的。而且使用 Guava 函数式风格将调用应用于每个对象仍然更加简洁易读
-
我能说什么 - 在这种情况下应用更具可读性是主观的。 And Guava team members think it's not.
-
@Sebastien Lorber:您的
eat方法不返回任何内容,因此从功能的角度来看,调用它毫无意义。您要做的是将功能样式应用于程序性事物,这是不受支持的。如果没有闭包,那么函数式风格就是 Java 太冗长了,难怪它的支持仅限于最适合的地方。
标签: java functional-programming guava