用于放置和删除条目的Android Bundle Iterator

时间:2015-11-14 06:21:39

标签: java android iterator bundle

我正在寻找一种迭代Bundle对象中包含的条目的方法。目前,我错误地使用For Each方法:

for (String key : bundle.keySet()) {
    if ("videourl".equals(key.toLowerCase()) || "priority".equals(key.toLowerCase())) {
        // Save value to bundle using lowercase key value
        extras.putString(key.toLowerCase(), (String) extras.get(key));
        // Remove original version of this bundle entry
        extras.remove(key);
    }
}

上述方法的问题在于,它在未来的未确定时间会冒任意,非确定性行为的风险。

我已经看过Map对象的迭代器实现(例如https://stackoverflow.com/a/1884916/3957979):

for(Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); it.hasNext(); ) {
  Map.Entry<String, String> entry = it.next();
  if(entry.getKey().equals("test")) {
    it.remove();
  }
}

但是,我无法直接访问Bundle的条目,因此我无法使用相同的方法。

如果Iterators可以与Bundle对象一起使用,请告诉我,或者请提出不同的方法。

1 个答案:

答案 0 :(得分:0)

不幸的是,我无法找到使用迭代器添加和删除Bundle条目的方法。我的解决方法是将要添加的条目保存到临时Bundle对象中,并将要删除的条目的原始密钥名称保存到List。请参阅以下代码:

// Loop through all messages and change the extras' key names to lowercase (only for keys of interest)
Bundle tempBundle = new Bundle();
ArrayList<String> keysToBeRemoved = new ArrayList<>();
Bundle extras = messages.get(i).getExtras();

for (String key : extras.keySet()) {
    // Check if key is not all lower case and if it is a key of interest
    if (!key.equals(key.toLowerCase()) && isKeyOfInterest(key)) {
        // Save value to bundle using lowercase key value
        tempBundle.putString(key.toLowerCase(), extras.getString(key));
        // Add original version of this key to a list for later deletion
        keysToBeRemoved.add(key);
    }
}

// Remove original entries from message extras
for (String originalKey : keysToBeRemoved) {
    extras.remove(originalKey);
}

// Add all new bundle entries to message extras
extras.putAll(tempBundle);

尽管如此,如果有人弄清楚如何使用捆绑的Iterator,我很想知道!