Mon*_*oon 130 java collections copy
我有一个List<SomeBean>从Web服务填充的.我想将该列表的内容复制/克隆到相同类型的空列表中.谷歌搜索复制列表建议我使用Collections.copy()方法.在我看到的所有示例中,目标列表应该包含要进行复制的确切项目数.
由于我使用的列表是通过Web服务填充的,它包含数百个对象,我不能使用上述技术.或者我使用它错了?? !! 无论如何,为了使它工作,我试图做这样的事情,但我仍然有一个IndexOutOfBoundsException.
List<SomeBean> wsList = app.allInOne(template);
List<SomeBean> wsListCopy=new ArrayList<SomeBean>(wsList.size());
Collections.copy(wsListCopy,wsList);
System.out.println(wsListCopy.size());
Run Code Online (Sandbox Code Playgroud)
我尝试使用wsListCopy=wsList.subList(0, wsList.size())但ConcurrentAccessException后来我在代码中得到了一个.命中和审判.:)
无论如何,我的问题很简单,如何将列表的整个内容复制到另一个列表?当然不是通过迭代.
fge*_*fge 226
只要用这个:
List<SomeBean> newList = new ArrayList<SomeBean>(otherList);
Run Code Online (Sandbox Code Playgroud)
注意:仍然没有线程安全,如果你otherList从另一个线程修改,那么你可能想要otherList(甚至newList)a CopyOnWriteArrayList,例如 - 或使用一个锁原语,如ReentrantReadWriteLock序列化对任何列表的读/写访问权限同时访问.
Dan*_*Dan 30
这是一个非常好的Java 8方法:
List<String> list2 = list1.stream().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
当然,这里的优点是您可以过滤并跳过仅列出部分列表的副本.
例如
//don't copy the first element
List<String> list2 = list1.stream().skip(1).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
Div*_*iya 11
originalArrayList.addAll(copyArrayofList);
Run Code Online (Sandbox Code Playgroud)
每当使用addAll()方法进行复制时请记住,数组列表(originalArrayList和copyArrayofList)对相同对象的引用内容将被添加到列表中,因此如果你修改其中任何一个,那么copyArrayofList也会反映同样的变化.
如果您不想要副作用,则需要将每个元素从originalArrayList复制到copyArrayofList,就像使用for或while循环一样.
我试着这样做,但我仍然得到一个IndexOutOfBoundsException.
我收到了ConcurrentAccessException
这意味着您在尝试复制列表时正在修改列表,很可能是在另一个线程中.要解决这个问题,你必须要么
使用专为并发访问而设计的集合.
适当地锁定集合,以便您可以迭代它(或允许您调用为您执行此操作的方法)
找一个离开,以避免需要复制原始列表.
Java 8 还有另一种空安全方法。
List<SomeBean> wsListCopy = Optional.ofNullable(wsList)
.map(Collection::stream)
.orElseGet(Stream::empty)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
如果你想跳过一个元素。
List<SomeBean> wsListCopy = Optional.ofNullable(wsList)
.map(Collection::stream)
.orElseGet(Stream::empty)
.skip(1)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
Java 9+ 可以使用Optional的stream方法
Optional.ofNullable(wsList)
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)
Starting from Java 10:
List<E> oldList = List.of();
List<E> newList = List.copyOf(oldList);
Run Code Online (Sandbox Code Playgroud)
List.copyOf() returns an unmodifiable List containing the elements of the given Collection.
The given Collection must not be null, and it must not contain any null elements.
Also, if you want to create a deep copy of a List, you can find many good answers here.
| 归档时间: |
|
| 查看次数: |
230250 次 |
| 最近记录: |