我正在对DynamoDB表执行扫描,然后我需要将返回项中的相应属性添加到类型为User
的列表中(User
具有单个构造函数User(String uuid)
) 。代码当前成功扫描数据库并返回List
扫描结果。但是我的迭代似乎由于某种原因返回null。
AmazonDynamoDBClient client = dynamoClient.getDynamoClient();
DynamoDBMapper mapper = new DynamoDBMapper(client);
try {
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
Map<String, Condition> scanFilter = new HashMap<String, Condition>();
Condition scanCondition =
new Condition().withComparisonOperator(ComparisonOperator.NOT_NULL);
scanFilter.put("uuid", scanCondition);
scanExpression.setScanFilter(scanFilter);
List scanResults = mapper.scan(UserAccounts.class, scanExpression);
for (Iterator it = scanResults.iterator(); it.hasNext();) {
//User user = (User) it.next();
allUserSummary.add(new User(scanResults.get(1).toString()));
}
} catch (Exception e) {
// TODO
}
答案 0 :(得分:2)
我建议你通过The For-Each Loop开始使用现代和紧凑的列表迭代,这有助于在使用旧的迭代样式时避免许多常见错误:
[...]
迭代器只是杂乱无章。此外,这是一个机会 错误。迭代器变量在每个循环中出现三次:即 有两次机会弄错了。 for-each构造摆脱了 杂乱和错误的机会。以下是该示例的外观 与for-each构造:
void cancelAll(Collection<TimerTask> c) { for (TimerTask t : c) t.cancel(); }
将此应用于您的用例会产生以下结果:
List<UserAccounts> scanResults = mapper.scan(UserAccounts.class, scanExpression);
for (UserAccounts userAccounts : scanResults) {
allUserSummary.add(new User(userAccounts.toString()));
}
如果这不起作用,它也可能暗示实际错误,只要您的代码假定toString()
类UserAccounts
返回 uuid ,可能是也可能不是。通常的方法是使用getKey()
或getUuidAttribute()
方法以及相应的注释@DynamoDBHashKey
或@DynamoDBAttribute
,如Class DynamoDBMapper的示例所示,例如:
@DynamoDBTable(tableName = "UserAccounts")
public class UserAccounts{
private String key; // or uuid right away
@DynamoDBHashKey
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
// ...
}
这显然会为您的示例提供以下内容:
List<UserAccounts> scanResults = mapper.scan(UserAccounts.class, scanExpression);
for (UserAccounts userAccounts : scanResults) {
allUserSummary.add(new User(userAccounts.getKey()));
}