You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:27:58