有没有办法在for循环中链接列表(或地图)?

ilo*_*mbo 1 java loops for-loop

有这个代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

如果两个循环中的代码相同,是否有一种简单的方法将两个循环组合成一个循环?(假设所有地图键都不同).
我确实有一些想法也会有所帮助(比如将两个映射合并到一个映射中或者让一个方法用map作为参数进行循环),但是我想知道Java语法中是否有一些东西只允许链接两个类似的列出并循环遍历它们.

Bor*_*der 5

Java本身不支持此行为.

如果您使用Google Guava,那么您可以这样做:

for (final Rect rect : Iterables.concat(map1.values(), map2.values())) {

}
Run Code Online (Sandbox Code Playgroud)

你也可以敲一个快速的实用课程.我在这里使用了varargs以便使用更好; 缺点是编译器会抛出大量警告,因为通用数组创建和varargs方法未经检查.

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.");
            }
        };
    }

}
Run Code Online (Sandbox Code Playgroud)

用法类似于:

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);
}
Run Code Online (Sandbox Code Playgroud)

而且具有魔力 import static

for (final String s : concat(s1, s2, s3)) {
    System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)

如果你是那种东西......