Java在没有ConcurrentModificationException的同一循环中添加/删除

时间:2017-04-10 12:05:51

标签: java

我有以下Java代码:

if (value instanceof Collection) {
    Collection collection = (Collection) value;
    Collection updatedObjects = new ArrayList<>();
    for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
        Object object = iterator.next();
        if (object instanceof String) {
            iterator.remove();
            updatedObjects.add(StringUtils.wrapInSingleQuotes((String) object));
        } else if (object instanceof Date) {
            iterator.remove();
            updatedObjects.add(((Date) object).getTime());
        }
    }
    collection.addAll(updatedObjects);
}

是否可以以更有效的方式重写此代码以避免新的ArrayList分配?如果是,请举个例子。

1 个答案:

答案 0 :(得分:1)

不同类型的Collection是不好的做法,无论如何你可以使用Java 8流:

return collection.stream().map(object -> {
        if (object instanceof String) {
            return StringUtils.wrapInSingleQuotes((String) object);
        } else if (object instanceof Date) {
            return ((Date) object).getTime();
        }
    }).collect(Collectors.toList());

另外,您可以避免在最后一行写入

之前调用iterator.remove()
collection.clear();
collection.addAll...

如果要更新变量collection的值,因为参数是变量的,例如,您可以按照java.util.List.sort实现中的逻辑进行操作。

    Object[] updatedObjects = collection.toArray();
    //fill the array updatedObjects 
    ListIterator<E> i = collection.listIterator();//this works only if collection is a list
    for (Object e : updatedObjects ) {
        i.next();
        i.set((E) e);
    }