gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:50:55 24 4
gpt4 key购买 nike

有这段代码:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com