Java 8:如果在地图关键字中找不到元素,则从列表中删除元素

时间:2019-02-22 15:36:35

标签: java list java-8 hashmap

我想删除所有列表元素,它们的最后一个拆分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

知道我做错了什么吗?

3 个答案:

答案 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(",")));