我正在从DynamoDB中执行batchLoadItem,它以以下形式返回:
Map<String, List<Object>>
为了测试它是否正确回归我对返回的数据进行了迭代,如下所示:
for(Map.Entry<String, List<Object>> entry : individualAlarmsReturnedFromDatabase.entrySet()){
List<Object> value = entry.getValue();
System.out.println("HASH " + value);
}
并在日志中返回:
HASH [com.amazonaws.models.nosql.IndividualAlarmsDatabaseModel@ab28829, com.amazonaws.models.nosql.IndividualAlarmsDatabaseModel@c36a7ae, com.amazonaws.models.nosql.IndividualAlarmsDatabaseModel@8f0994f, com.amazonaws.models.nosql.IndividualAlarmsDatabaseModel@f4188dc, com.amazonaws.models.nosql.IndividualAlarmsDatabaseModel@cc27de5]
这是正确返回的,您可以看到数据采用DataBaseModel的形式。
我已尝试过在stackoverflow上找到的所有方法,但我不知道如何将其转换为ArrayList<DatabaseModel>
因为它返回Map<String, List<Object>>
由于
答案 0 :(得分:2)
一个简单的方法就是这个
List<DatabaseModel> value = (List<DatabaseModel>)entry.getValue();
// oops error
JIC,为什么错误,Read Wildcards and Subtyping
所以我们可以通过向上转换来欺骗编译器
List<DatabaseModel> value = (List<DatabaseModel>)((Object)entry.getValue());
答案 1 :(得分:2)
Lino的答案很棒。如果您不能使用Java 8流,则可以对现有代码进行简单的更改:
List<DatabaseModel> models = new ArrayList<DatabaseModel>();
for(Map.Entry<String, List<Object>> entry : individualAlarmsReturnedFromDatabase.entrySet()){
List<Object> value = entry.getValue();
for(Object valueObj : value)
models.add((DatabaseModel)valueObj);
}
答案 2 :(得分:1)
新答案
正如您所说,您无法使用流API,请尝试以下操作:
ArrayList<DatabaseModel> list = new ArrayList<>();
for(Map.Entry<String, List<Object>> entry : map.entrySet()){
for(Object o : entry.getValue()){
list.add((DatabaseModel) o);
}
}
OLD ANSWER
尝试使用java8
- StreamAPI:
ArrayList<DatabaseModel> list = map.entrySet().stream()
.map(Map.Entry::getValue)
.flatMap(Collection::stream)
.map(o -> (DatabaseModel) o)
.collect(Collectors.toCollection(ArrayList::new));
以上代码段的工作原理如下:
Java8-Streams
的基础:map.entrySet().stream()
.map(Map.Entry::getValue)
.flatMap(Collection::stream)
.map(o -> (DatabaseModel) o)
.collect(Collectors.toCollection(ArrayList::new));