我有String
的列表,我想对列表中的所有String
执行相同的操作。
是否可以不执行循环?
答案 0 :(得分:9)
嗯某些东西必须循环到某个地方 - 如果你想将它抽象到你自己的方法中,你可以这样做,但我不相信框架内置了任何内容。
Guava在Iterables
中有各种方法来执行预测等,但如果你想在每一步修改列表,我不确定是否支持那。同样,如果你愿意,你可以编写自己的方法(非常简单)。
当Java最终获得闭包时,这种事情会变得更加合理 - 不幸的是,目前,指定“某事”操作通常比硬编码循环更值得付出努力。
答案 1 :(得分:4)
你可以递归地做,但我不明白你为什么要这样做。您可能能够找到与Python的map函数类似的东西(在幕后,它将是循环或递归方法)
另请注意,字符串是不可变的 - 因此您无论如何都必须创建“副本”。
答案 2 :(得分:4)
没有。您必须遍历列表。
for(String s:yourlist){
dooperation(s);
}
答案 3 :(得分:3)
为什么你不想进行循环?
如果是计算复杂性,那么不,这是不可避免的。所有方法都将基本归结为迭代列表中的每个项目。
如果是因为你想要更清洁的东西,那么答案取决于你认为更干净的东西。有各种各样的库可以添加某种形式的功能映射,最终会出现类似的内容:
map(list, new Mapper<String, String>() {
public String map(String input) {
return doSomethingToString(input);
}
);
这显然比简单的循环更长,更复杂
for (int i = 0; i < list.size(); i += 1) {
list[i] = doSomethingToString(list[i]);
}
但它确实提供了可重用性。
map(list, new DoSomethingToStringMapper());
map(otherlist, new DoSomethingToStringMapper());
但可能你不需要这个。一个简单的循环将是要走的路。
答案 4 :(得分:2)
答案 5 :(得分:2)
根据无循环的含义,您可能会对此感兴趣: java的map函数。
http://www.gubatron.com/blog/2010/08/31/map-function-in-java/
......里面还有一个循环。
答案 6 :(得分:2)
在Java中,您需要迭代Collection中的元素并应用该方法。我知道Groovy提供*语法来执行此操作。您可以为您的功能创建一个界面,例如使用apply方法并编写一个方法,如果要添加一些通用API来执行此操作,则需要使用Collection和包含该函数的接口。但是你需要在某个地方进行迭代!
答案 7 :(得分:2)
您可以使用apache commons util。
答案 8 :(得分:2)
使用多线程遍历进行分而治之。确保返回新的/不可变的转换集合对象(如果你想避免并发问题),然后你最终可以合并(可能正在使用另一个线程,它将在所有工作线程完成分割列表上的变换器任务后唤醒?) 。 如果在创建这些中间集合时缺少内存,则在源集合上进行同步。这是你能做的最好的事情。
答案 9 :(得分:1)
不,你必须使用循环。
答案 10 :(得分:1)
您必须对列表中的字符串的每个引用变量执行操作,因此需要循环。
如果它在List级别,显然有一些操作(removeAll等)。
答案 11 :(得分:1)
java API 提供了用于存储和操作对象组的特殊类。一个这样的类是 Arraylist
请注意 Arraylist 类位于 java.util.ArrayList
中像创建任何对象一样创建一个ArrayList。
import java.util.ArrayList;
//..
ArrayList ajay = new ArrayList();
这里
ArrayList - &gt;类
ajay - &gt;对象
您可以选择指定 Arraylist 将容纳的对象的容量和类型:
ArrayList ajay<String> = new ArrayList<String>(10);
Arraylist类为操作对象提供了许多有用的方法..
add()方法将新对象添加到ArrayList.And remove()方法从列表中删除对象..
示例代码:
import java.util.ArrayList;
public class MyClass {
public static void main(String[ ] args) {
ArrayList<String> ajay = new ArrayList<String>();
ajay.add("Red");
ajay.add("Blue");
ajay.add("Green");
ajay.add("Orange");
ajay.remove("Green");
System.out.println(colors);
}
}
此代码的输出:
[Red,Blue,Orange]
答案 12 :(得分:0)
已接受的答案链接已中断,并且已弃用解决方案:
<强> @Deprecated 强>
public static <T,C extends Closure<? super T>> C forAllDo(Iterable<T> collection, C closure)
<强>已过时。从4.1开始,使用
IterableUtils.forEach(Iterable, Closure)
代替
对集合中的每个元素执行给定的闭包。 如果输入集合或闭包为null,则不会进行任何更改。
您可以使用IterableUtils::forEach(Closure c)
将闭包应用于提供的iterable的每个元素。