转换Map <string,list <object =“”>&gt;到ArrayList <databasemodel>

时间:2017-11-13 16:00:05

标签: java android arraylist hashmap amazon-dynamodb

我正在从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>>

由于

3 个答案:

答案 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));

以上代码段的工作原理如下:

  1. 获取条目的{Stream Java8-Streams的基础:map.entrySet().stream()
  2. 获取包含值列表.map(Map.Entry::getValue)
  3. 的新流
  4. 获取包含值.flatMap(Collection::stream)
  5. 的新流
  6. 将值转换为DatabaseModel .map(o -> (DatabaseModel) o)
  7. 将所有值收集到ArrayList .collect(Collectors.toCollection(ArrayList::new));