我的for循环太长了.作为演示,方法B有三个for循环.有没有办法可以将它减少为一个简短的for循环(一个循环)?谢谢
public class MyMates
{
private static TreeSet<String> myTable = new TreeSet<String>();
private static String[] names1 = null;
private static String[] names2 = null;
private static String[] names3 = null;
public MyMates()
{
super();
myTable = new TreeSet<String>();
}
public static String methodA(String aTemp)
{
String[] names1 = new String[] {"Amy", "Jose", "Jeremy", "Alice", "Patrick"};
String[] names2 = new String[] { "Alan", "Amy", "Jeremy", "Helen", "Alexi"};
String[] names3 = new String[] { "Adel", "Aaron", "Amy", "James", "Alice" };
return aTemp;
}
public static String methodB(String bTemp)
{
for (int i = 0; i < names1.length; i++) {
myTable.add(names1[i]);
}
System.out.println(myTable);
for (int i = 0; i < names2.length; i++) {
myTable.add(names2[i]);
}
System.out.println(myTable);
for (int i = 0; i < names3.length; i++) {
myTable.add(names3[i]);
}
System.out.println(myTable);
return bTemp;
}
Run Code Online (Sandbox Code Playgroud)
在此处输入代码
实际上,你不需要任何for循环:
myTable.addAll(Arrays.asList(names1));
myTable.addAll(Arrays.asList(names2));
myTable.addAll(Arrays.asList(names3));
Run Code Online (Sandbox Code Playgroud)
当你有这样的东西(在伪代码中):
doA(x);
doB(x);
doC(x);
doA(y);
doB(y);
doC(y);
Run Code Online (Sandbox Code Playgroud)
你可以经常(虽然不总是)提取doA/doB/doC
和重构为这样的方法doABC
:
void doABC(o) {
doA(o);
doB(o);
doC(o);
}
Run Code Online (Sandbox Code Playgroud)
然后在其他地方你做:
doABC(x);
doABC(y);
Run Code Online (Sandbox Code Playgroud)
这称为提取方法重构.
从1.5开始,为数组和实例添加for-each循环Iterable
.这是一个简单的例子:
String[] names = { "Alice", "Bob", "Carol" };
for (String name : names) {
System.out.println(name);
}
// "Alice", "Bob", "Carol"
Run Code Online (Sandbox Code Playgroud)
Effective Java 2nd Editionfor-each
for
引用,第46项:首选循环到传统循环:
for-each
在1.5版中引入的循环通过完全隐藏迭代器或索引变量来消除混乱和错误的机会.由此产生的习语同样适用于集合和数组:Run Code Online (Sandbox Code Playgroud)// The preferred idiom for iterating over collections and arrays for (Element e : elements) { doSomething(e); }
当你看到冒号(:)时,将其读作"in".因此,上面的循环读作"对于元素
e
中的每个元素".请注意for-each
,即使对于数组,使用循环也不会有性能损失.事实上,for
在某些情况下,它可能比普通循环提供轻微的性能优势,因为它只计算一次数组索引的限制.
该for-each
循环不适用于所有情况,但是当它出现时,您应该始终尝试使用它来提高可读性并最大限度地减少出错的可能性.
Collection.addAll
Collection<E>
定义addAll(Collection<? extends E>
可以用于将所有元素从一个添加Collection
到另一个(假设它是类型安全的).
而且,Arrays.asList(T...)
可以创建一个List
由引用数组(而不是原语!)支持的.
这意味着在这种情况下你可以这样做:
myTable.addAll(Arrays.asList(names1));
myTable.addAll(Arrays.asList(names2));
myTable.addAll(Arrays.asList(names3));
Run Code Online (Sandbox Code Playgroud)
需要注意的是一个常见的问题是传递,例如一int[]
对Arrays.asList
,并希望能得到List<Integer>
.这是不行的,因为当一个int
是autoboxable到Integer
,一个int[]
是不 autoboxable到Integer[]
.
你写了以下内容:
public class MyMates {
private static String[] names1 = null;
private static String[] names2 = null;
private static String[] names3 = null;
public static String methodA(String aTemp) {
String[] names1 = ...;
String[] names2 = ...;
String[] names3 = ...;
return aTemp;
}
Run Code Online (Sandbox Code Playgroud)
它需要说的是,在分配methodA
是在本地声明的变量names1
,names2
,names3
即阴影具有相同名称的字段.这些变量最终超出了范围methodA
,因此几乎没有任何目的.
这通常不是你想要的.您可能打算分配给字段,即:
public static String methodA(String aTemp) {
names1 = ...;
names2 = ...;
names3 = ...;
return aTemp;
}
Run Code Online (Sandbox Code Playgroud)