Java中如何将指定元素从一个ArrayList移至另一个ArrayList?
解决方法:将指定元素从table1迁移到table2
嘿,这个需求在日常开发里挺常见的,我给你分享几种靠谱的实现方式,适配不同的Java版本和场景:
方法一:使用迭代器(安全无并发修改异常)
这是最传统也最安全的方式,能避免直接遍历删除时出现的ConcurrentModificationException:
Iterator<SellableItems> iterator = table1.iterator(); while (iterator.hasNext()) { SellableItems item = iterator.next(); // 匹配条件:名称为beer且价格等于20 if ("beer".equals(item.getName()) && item.getPrice() == 20) { table2.add(item); // 先加入目标列表 iterator.remove(); // 从原列表安全移除当前元素 } }
为什么用迭代器?因为如果直接用for-each循环或者普通索引循环删除元素,集合的内部结构会在遍历过程中改变,导致迭代器感知到不一致从而抛出异常。迭代器的remove()方法是集合官方认可的安全删除方式,能同步更新迭代器和集合的状态。
方法二:Java 8+ 简洁Stream API方式
如果你的项目用的是Java 8及以上版本,用Stream能写出更简洁易读的代码:
import java.util.stream.Collectors; // 先筛选出所有符合条件的元素 List<SellableItems> itemsToMove = table1.stream() .filter(item -> "beer".equals(item.getName()) && item.getPrice() == 20) .collect(Collectors.toList()); // 批量迁移:先添加到table2,再从table1移除 table2.addAll(itemsToMove); table1.removeAll(itemsToMove);
这种方式的好处是代码逻辑清晰,一眼就能看出要做什么。需要注意的是,如果有多个符合条件的beer元素,都会被批量迁移,和迭代器方式效果一致。
额外场景:只迁移第一个匹配的元素
如果你只需要移动第一个找到的符合条件的元素,可以简化成这样:
迭代器版本
Iterator<SellableItems> iterator = table1.iterator(); while (iterator.hasNext()) { SellableItems item = iterator.next(); if ("beer".equals(item.getName()) && item.getPrice() == 20) { table2.add(item); iterator.remove(); break; // 找到第一个后直接退出循环 } }
Stream版本
table1.stream() .filter(item -> "beer".equals(item.getName()) && item.getPrice() == 20) .findFirst() .ifPresent(item -> { table2.add(item); table1.remove(item); });
小提醒
确保你的SellableItems类已经正确实现了getName()和getPrice()方法,不然条件判断会失效哦~
内容的提问来源于stack exchange,提问作者Peter Holdensgaard
相关产品推荐
相关产品推荐

