有这段代码:
Map<String,Rect> map1 = new HashMap<String,Rect>();
Map<String,Rect> map2 = new HashMap<String,Rect>();
...
for( Rect r: map1.values() ) {
r.offset(10,10);
}
for( Rect r: map2.values() ) {
r.offset(10,10);
}
如果两个循环中的代码相同,是否有一种简单的方法可以将两个循环合并为一个循环? (假设所有映射键都不同)。
我确实有一些想法也有帮助(比如将两张 map 合并到一张 map 或有一个方法以 map 作为参数进行循环),但我想知道如果 Java 语法中有某些东西只允许链接两个相似的列表并循环遍历它们。
最佳答案
Java 本身不支持这种行为。
如果您要使用 Google Guava那么你可以这样做:
for (final Rect rect : Iterables.concat(map1.values(), map2.values())) {
}
您还可以快速学习实用程序类。我在这里使用了可变参数,这样使用起来更好;缺点是编译器会抛出大量警告,因为通用数组创建和可变参数方法未被选中。
public class CombinedIterable<T> implements Iterable<T> {
public static <T> Iterable<T> concat(Iterable<? extends T>... iterables) {
return new CombinedIterable<T>(iterables);
}
private final List<Iterable<? extends T>> iterables;
private CombinedIterable(Iterable<? extends T>... iterables) {
this.iterables = Arrays.asList(iterables);
}
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
private final Iterator<Iterable<? extends T>> pos = iterables.iterator();
private Iterator<? extends T> iter = pos.next().iterator();
@Override
public boolean hasNext() {
if (iter.hasNext()) {
return true;
}
if (pos.hasNext()) {
iter = pos.next().iterator();
}
return iter.hasNext();
}
@Override
public T next() {
return iter.next();
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not supported.");
}
};
}
}
用法是这样的:
final List<String> s1 = Arrays.asList(new String[]{"A", "B", "C"});
final List<String> s2 = Arrays.asList(new String[]{"D", "E", "F"});
final List<String> s3 = Arrays.asList(new String[]{"H", "I", "J"});
for (final String s : CombinedIterable.concat(s1, s2, s3)) {
System.out.println(s);
}
还有 import static
的魔力
for (final String s : concat(s1, s2, s3)) {
System.out.println(s);
}
如果你喜欢那种东西......
关于java - 有没有办法在 for 循环中链接列表(或 map )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21324036/