java - 有没有办法在 for 循环中链接列表(或 map )?

标签 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);
}

如果两个循环中的代码相同,是否有一种简单的方法可以将两个循环合并为一个循环? (假设所有映射键都不同)。
我确实有一些想法也有帮助(比如将两张 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/

相关文章:

java - 为 GAE 设置 JRebel

Java Web Start - 多个快捷方式

java - Java 中的数组和垃圾回收

java - Pod 停留在挂起状态

Java 线程 for 循环,具有暂停和恢复功能

arrays - 如何在 julia 的一个 for 循环中实现 5 维数组?

java - 在 Java 中跳过 For 循环中的迭代

R循环创建新文件夹

c++ - 如何遍历列表但停在 size-1

Python:带有 2 个 for 循环的 Else 语句