我们无法对从<Collection>.add
获取的集合执行<Collection>.addAll
或Arrays.asList
操作。只允许删除操作。
那么如果我遇到需要在List
中添加新元素而不删除List
中的先前元素的情况,该怎么办?我怎样才能做到这一点?
答案 0 :(得分:56)
使用构造函数创建一个新的ArrayList
:
List<String> list = new ArrayList<String>(Arrays.asList("a", "b"));
答案 1 :(得分:12)
一种方法是构建一个新的ArrayList
:
List<T> list = new ArrayList<T>(Arrays.asList(...));
完成后,您可以随意修改list
。
答案 2 :(得分:4)
您可以使用Java8流来处理中间ArrayList
:
Integer[] array = {1, 2, 3};
List<Integer> list = Streams.concat(Arrays.stream(array),
Stream.of(4)).collect(Collectors.toList());
这应该非常有效,因为它可以迭代数组并预先分配目标列表。对于大型阵列,它可能会或可能不会更好。一如既往,如果重要,你必须衡量。
答案 3 :(得分:3)
Collection的构造函数(例如以下示例中的ArrayList)将数组作为列表,并使用该列表的元素构造新实例。
List<T> list = new ArrayList<T>(Arrays.asList(...));
http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#ArrayList(java.util.Collection)
答案 4 :(得分:3)
Arrays.asList()生成一个实际由数组支持的列表,它是一个变形为列表的数组。您可以将其用作列表,但不能对其执行某些操作,例如添加新元素。所以最好的选择是将它传递给另一个列表obj的构造函数:
List<T> list = new ArrayList<T>(Arrays.asList(...));
答案 5 :(得分:0)
Arrays.asList()
生成关于对象创建的不可修改列表。您可以使用以下代码。
List list = Collections.synchronizedList(new ArrayList(...));
此转换允许列表添加和删除对象。我只在Java 8中测试过。
答案 6 :(得分:0)
ArrayList<Object> MyObjectList = new ArrayList<>();
Arrays.asList(params[1]).forEach((item)-> {
MyObjectList.add(item);
});
答案 7 :(得分:0)
如今,Streams API 可以以简洁且实用的方式轻松为您提供ArrayList
:
Stream.of("str1", "str2").collect(Collectors.toList()));
当然,这也可以灵活地使用映射进行转换。例如,在为 Spring 安全代码编写单元测试时,编写以下内容很方便:
Stream.of("ROLE_1", "ROLE_2").map(SimpleGrantedAuthority::new).collect(Collectors.toList()));
Collectors.toList
返回的列表是一个 ArrayList
,可以根据您的代码要求进行修改。