Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将函数应用于每个集合元素,以便在番石榴中对其进行变异?_Java_Loops_Guava - Fatal编程技术网

Java 如何将函数应用于每个集合元素,以便在番石榴中对其进行变异?

Java 如何将函数应用于每个集合元素,以便在番石榴中对其进行变异?,java,loops,guava,Java,Loops,Guava,我使用Guava 11(因为java 5)已经有一年了,但我似乎没有找到一种方法来实现Groovy的each或Scala的foreach,也就是说,将函数应用到集合的元素,这些元素可以对它们进行变异,并返回变异元素的集合。。。所有这些关于易趣、集合等的方法实际上都不能做到这一点。我不想用for循环。也许Iterables.all()可以最好地实现这一目的,但没有办法做到以下几点: Iterable result = Iterables.each(Iterables.filter(c, predi

我使用Guava 11(因为java 5)已经有一年了,但我似乎没有找到一种方法来实现Groovy的each或Scala的foreach,也就是说,将函数应用到集合的元素,这些元素可以对它们进行变异,并返回变异元素的集合。。。所有这些关于易趣、集合等的方法实际上都不能做到这一点。我不想用for循环。也许Iterables.all()可以最好地实现这一目的,但没有办法做到以下几点:

Iterable result = Iterables.each(Iterables.filter(c, predicate), function);

我刚刚找到答案,与Groovy的每个方法最接近的番石榴收集方法是Iterables.all。谓词将表示是否所有成员都被修改或根本没有修改。尽管无法链接方法调用,因为Iterables.all()返回布尔值。

我认为Guava不包含用于此的方法,因为Java包含用于执行此操作的每个循环:

for(Element x : collection){
  mutate(x);
}
编辑:更通用的方法是将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;
}
接口突变{
无效申请(T主题);
}

集合你想用番石榴中的函数变换集合中的每个元素吗?不,我想修改元素,变换是不可变的,不是吗?我的意思是有一个新集合,其中每个元素都是从另一个集合的某个变换中获得的?然后你能准确地解释你的问题吗?或者提供一个更好的例子?也许不是每个人都使用过Groovy或Scala。如果您能给出一个示例并说明您预期会发生什么,但实际上会发生什么,您可以改进您的问题。那么,如果Java有for循环,为什么groovy和scala包含它呢?因为你可以把东西链起来,对吗?你能用for循环链接东西吗?@Sloin链接for循环很简单(等等):先写第一个循环,然后写第二个循环。由于您正在修改集合的内容,因此不存在需要链接才能实际执行计算的延迟转换或筛选。很好,编写3个循环,3个私有getMeSomething(arg)方法。。。非常令人讨厌的命令式代码。。。我问这个问题是为了不必强制编程,两个人过来说:强制执行…@Sloin你说你想改变集合的元素。这不是一个功能性操作。使用它的流畅风格(使用链式方法调用)并始终返回同一个集合并不会降低它的必要性。@Sloin Java是一种命令式语言(请参阅以了解为什么在Guava中找不到每个函数构造)。当Java8最终发布时,您将有一个和lambdas的语法糖来帮助编写一个。