今天写业务时有一个list.removeAll(list1)操作,两个list都是有值的,但是运行到此处就会报错,然后就打断点调试,发现是两个list类型不同导致的异常抛出,前者是openjdk16的语法糖stream().toList()返回的不可变类型的list,后者是ArrayList,在此记录下来
异常信息:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)
at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.removeAll(ImmutableCollections.java:151)
代码复现:
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
// 转换
list=list.stream().toList();
// 被删除的元素
List<String> listRemove = new ArrayList<>();
listRemove.add("1");
listRemove.add("2");
listRemove.add("3");
list.removeAll(listRemove);
System.out.println(list);
}
}
运行结果:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)
at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.removeAll(ImmutableCollections.java:151)
原因:
stream().toList()方法返回一个不可变的list,无论任何对这个list修改的方法都会抛出异常
解决方案:
使用原始的流处理方法 :stream().collect(Collectors.toList()),返回一个可变的list