如何将函数应用于每个集合元素以便在Guava中进行变异?

lis*_*sak 3 java loops guava

我现在使用Guava 11(因为java 5)一年了,但我似乎没有找到一种方法来做Groovy的每一个或Scala的foreach,也就是说,将函数应用于集合的元素,可以改变它们和那个返回变异元素的集合... Iterables,Collections等上的所有这些方法实际上都不能做到这一点.我不想用于循环.也许Iterables.all()可以最好地服务于这个目的,但是没有办法做这样的事情:

Iterable result = Iterables.each(Iterables.filter(c, predicate), function);
Run Code Online (Sandbox Code Playgroud)

Mic*_*ßer 7

我不认为Guava包含一个方法,因为Java包含for-each循环:

for(Element x : collection){
  mutate(x);
}
Run Code Online (Sandbox Code Playgroud)

编辑:一种更通用的方法是将for-each循环封装在一个方法中,并将变异策略作为参数传递给它:

interface Mutation<T> {
    void apply(T subject);
}

<T> Collection<? extends T> mutate(Collection<? extends T> input, Mutation<? super T> mutation) {
    for (T element : input) {
        mutation.apply(element);
    }
    return input;
}
Run Code Online (Sandbox Code Playgroud)

  • @Sloin你说你想改变一个集合的元素.这不是功能操作.使用流畅的样式(使用链式方法调用)并始终返回相同的集合并不会减少它的必要性. (4认同)
  • @Sloin Java*是一种命令式语言(参见[Guava的wiki](https://code.google.com/p/guava-libraries/wiki/FunctionalExplained),了解为什么你找不到每个功能结构在番石榴).当Java 8终于出来时,你将有一个[`forEach()`](http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/ lang/Iterable.java)和lambdas的语法糖来帮助写一个[`Consumer`](http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/的java/util的/功能/ Consumer.java). (3认同)