我有一个遍历包含<Key, <List<Pair>>
的映射的方法。我将如何遍历并获得所有结果?由于此列表包含多种货币。我不希望将不同类型的货币金额加在一起。我的尝试在下面,似乎并没有收集所有结果
答案 0 :(得分:0)
Map<Date, List<Pair<BigDecimal, Currency>>> map = ...
map.forEach((date, list) -> {
list.forEach(pair -> {
// business logic here
});
});
这将遍历地图,并依次遍历每个列表。尚不清楚您要实现什么目标,但是希望这将为您指明正确的方向。
编辑(不使用Java 8)
for (Map.Entry<Date, List<Pair<BigDecimal, Currency>>> entry : map.entrySet()) {
Date date = entry.getKey();
List<Pair<BigDecimal, Currency>> list = entry.getValue();
for (Pair<BigDecimal, Currency> pair : list) {
BigDecimal bd = pair.getKey();
Currency currency = pair.getValue();
//business logic here
}
}
它不太优雅(我想这是升级到Java 8的原因),但是在功能上与第一个解决方案等效(范围/变量名称略有不同)。 for (T t : Iterable<T>)
语法是在Java 5中通过Iterable
接口引入的,因此它实际上适用于所有人。
编辑(如果专门使用Iterator
)
while (source.hasNext()) {
Map.Entry<Date, List<Pair<BigDecimal, Currency>>> entry = source.next();
Date date = entry.getKey();
List<Pair<BigDecimal, Currency>> list = entry.getValue();
for (Pair<BigDecimal, Currency> pair : list) {
BigDecimal bd = pair.getKey();
Currency currency = pair.getValue();
//business logic here
}
}
答案 1 :(得分:0)
假设您有一个包含所有数据的地图,则可以执行以下操作:
Iterator<Entry<Date, List<Pair<BigDecimal, Currency>>>> itr = source.entrySet().iterator();
现在有了此迭代器,您可以将其转换为Element迭代器:
Iterator<Element> eItr = new Iterator<Element> {
int index = 0;
Iterator<Entry<Date, List<Pair<BigDecimal, Currency>>>> itr = source.entrySet().iterator();
Entry<Date, List<Pair<BigDecimal, Currency>>> current = itr.hasNext()? itr.next() : null;
@Override
public boolean hasNext() {
return current != null;
}
@Override
public Element next() {
try {
return new Element(current.getKey(), current.getValue().get(index).getFirst(), current.getValue().get(index).getSeccond());
} finally {
index++;
if (index >= current.getValue().size()) {
index = 0;
current = itr.hasNext()? itr.next() : null;
}
}
}
}