Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不带ConcurrentModificationException的Java在同一循环中添加/删除_Java - Fatal编程技术网

不带ConcurrentModificationException的Java在同一循环中添加/删除

不带ConcurrentModificationException的Java在同一循环中添加/删除,java,Java,我有以下Java代码: if (value instanceof Collection) { Collection collection = (Collection) value; Collection updatedObjects = new ArrayList<>(); for (Iterator iterator = collection.iterator(); iterator.hasNext();) { Object object =

我有以下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分配,是否可以以更有效的方式重写此代码?如果是这样,请给出一个示例。

使用不同类型的集合是不好的做法,无论如何,您可以使用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...
例如,如果要更新变量集合的值,因为它是一个参数varialble,则可以遵循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);
    }

谢谢你的回答。不幸的是,由于一个复杂的下划线逻辑,这是一个基于用户输入的本地Neo4j Cypher复杂查询的动态构建器,我无法避免此类代码。很抱歉提出额外的问题,但关于您的解决方案-从性能角度看,哪种方法更可取-我的方法还是您的方法?您可以添加收集声明吗?不,因为我从外部系统获取对象,它可以包含任何类型。。就像一个普通的包装纸。。如上面示例中的整数或集合。必须声明集合才能使用它。类似于集合集合,即使您自己没有初始化它。对不起,是的,我已经更新了我的问题。如果您强制转换到确保集合有序的列表,那么您可以通过调用E setint index,E element,使用修改后的值更新当前索引的值;在名单上。