我想删除所有列表元素,它们的最后一个拆分char在某些映射中未作为键建立。我使用以下代码:
List<String> myList = Arrays.asList("a.b.c,c.d.e".split(","));
myList.add("a.b.c");
Map myMap = new HashMap();
myMap.put("a","dumy");
myList.removeIf(el->!myMap.containsKey(el.substring(el.lastIndexOf('.') + 1)));
我收到以下错误消息:Method threw 'java.lang.UnsupportedOperationException' exception
。
知道我做错了什么吗?
答案 0 :(得分:8)
Arrays.asList()
创建固定大小的列表。您不能添加新元素或删除元素。
您可以使用new ArrayList<>(Arrays.asList(el))
答案 1 :(得分:1)
要进一步说明一下为什么不允许从通过ArrayList
创建的Arrays.asList (array)
添加(和删除)并抛出UnsupportedOperationException
的原因,首先我们知道这个{{ 1}}的作用是将数组转换为其等效的Arrays.asList(...)
实例:
ArrayList
这里发生的是您的String[] strArr = new String[]{"a","b","c"};
List<String> strList = Arrays.asList(strArr);
实际上是strArr
的备用数组,这意味着如果您修改strList
,则strArr[0]
的值也将随之变化,反之反之亦然。是的,它们的值将同步并且彼此保持一致。这就是为什么您不能对strList.get(0)
进行添加或删除的原因,因为后备数组由于是固定长度而无法满足要求,因此会哭泣和慌乱(如我们所知,数组总是固定大小,如果需要调整大小一个数组,您需要完全创建一个全新的数组,无法调整现有数组的大小);因此它会抛出strList
。
因此,正如@ByeBye所提到的,解决方案是用UnsupportedOperationException
包装它,这样它将是一个新的独立ArrayList
,没有任何后备数组,并且可以自由进行添加和删除
答案 2 :(得分:-1)
通过如下调整代码行来解决:
List<String> myList = Lists.newArrayList(Arrays.asList("a.b.c,c.d.e".split(",")));