如何从ArrayList中移除所有非数值元素?
移除ArrayList中非数值元素的实现方案
嘿,你的思路完全正确!Java里所有数值相关的类(Integer、Double、Long、Short、BigInteger这些)都继承自java.lang.Number,所以我们只需要判断元素是否属于Number体系,就能轻松过滤掉非数值元素。下面给你几种实用的实现方式:
方法一:迭代器遍历移除(兼容所有Java版本)
如果你的项目还在使用Java 8之前的版本,迭代器是最安全的方式(避免并发修改异常):
// 初始化你的列表 List<Object> list = new ArrayList<>(); list.add(new Integer(100)); list.add(new Double(3.14)); list.add(new Long(21L)); list.add(new Short("100")); list.add(new Double(5.1)); list.add("Kitty"); list.add(new Integer(100)); list.add(new Object()); list.add("Snoopy"); list.add(new BigInteger("1000")); // 用迭代器过滤元素 Iterator<Object> iterator = list.iterator(); while (iterator.hasNext()) { Object elem = iterator.next(); // 只要不是Number的实例,就移除 if (!(elem instanceof Number)) { iterator.remove(); } }
为什么用迭代器?因为如果直接用for循环或者foreach去remove元素,会触发ConcurrentModificationException,迭代器的remove()方法是集合设计中专门用来在遍历中修改元素的安全方式。
方法二:Java 8+ 一行代码搞定(更简洁)
如果你的项目已经升级到Java 8及以上,Stream API或者removeIf方法能让代码更简洁:
方式A:生成新的过滤后的列表
List<Object> filteredList = list.stream() .filter(elem -> elem instanceof Number) .collect(Collectors.toList());
方式B:直接修改原列表
list.removeIf(elem -> !(elem instanceof Number));
removeIf是Java 8给Collection接口新增的默认方法,内部已经处理了遍历修改的安全问题,一行代码就能完成原列表的过滤。
补充说明
BigInteger确实是Number的子类,所以会被保留下来;- 字符串(比如"Kitty")、普通Object实例这些非Number类型的元素都会被正确移除;
- 如果之后需要把过滤后的元素转成具体的数值类型,还可以在Stream里继续添加
map操作,比如map(Number::doubleValue)来统一转成Double类型。
内容的提问来源于stack exchange,提问作者rookie
相关产品推荐
相关产品推荐

