Using iterators

Simple iteration

For both ArrayList and HashTable:

function ListKeyValue(Collection data)
{
    local AcediaObject          key, value;
    local CollectionIterator    iter;

    for (iter = data.Iterate(); !iter.HasFinished(); iter.Next())
    {
        key     = iter.GetKey();
        value   = iter.Get();
        //  Do what you want here
        _.memory.Free(key);
        _.memory.Free(value);
    }
    iter.FreeSelf();
}

Skipping none values

function ListKeyValue(Collection data)
{
    local AcediaObject          key, value;
    local CollectionIterator    iter;

    iter = data.Iterate().LeaveOnlyNotNone();
    while (!iter.HasFinished())
    {
        key     = iter.GetKey();
        value   = iter.Get();
        //  Do what you want here
        _.memory.Free(key);
        _.memory.Free(value);
        iter.Next();
    }
    iter.FreeSelf();
}

Iteration over Text keys only

Text keys are only relevant for HashTables:

function ListKeyValue(HashTable data)
{
    local AcediaObject          key, value;
    local Text                  textKey;
    local CollectionIterator    iter;

    for (iter = data.Iterate(); !iter.HasFinished(); iter.Next())
    {
        key     = iter.GetKey();
        value   = iter.Get();
        textKey = Text(key);
        if (textKey != none)
        {
            Log(textKey.ToString() $ ":"
                @ _.text.IntoString(_.json.Print(value)));
        }
        _.memory.Free(key);
        _.memory.Free(value);
        //  `textKey` is the same reference as `key`!
    }
    iter.FreeSelf();
}