如何将同类型ArrayList元素添加至另一集合?是否有更简便方法?
更简便地实现List元素拷贝到另一个List的方案
Hey there! 很高兴看到你已经成功实现了需求,不过确实有更简洁高效的方式来完成这个操作,我来给你梳理几种适配不同场景的方案:
1. 浅拷贝:直接用addAll()(最简便)
如果你的场景不需要创建全新的Channel_Show_Model对象(比如只是复用原对象,不会修改对象属性,或者对象本身是不可变的),那么List自带的addAll()方法是最优解,一行代码就能搞定:
ArrayList<Channel_Show_Model> items = getIntent().getParcelableArrayListExtra(FORWARDED_ITEMS_FROM_MAIN); data.addAll(items);
注意点:
这种方式是浅拷贝,两个列表会共享同一个Channel_Show_Model对象的引用。如果之后修改原列表中某个元素的属性,新列表里对应的元素也会跟着变化,反之亦然。如果你的业务逻辑允许这种共享,这无疑是最高效的选择。
2. 深拷贝:用Stream API简化对象复制
如果需要像你原代码那样,创建新的Channel_Show_Model对象(避免原对象修改影响新列表),Java 8+的Stream API可以让代码更简洁优雅:
基础版(直接调用构造方法)
ArrayList<Channel_Show_Model> items = getIntent().getParcelableArrayListExtra(FORWARDED_ITEMS_FROM_MAIN); data.addAll(items.stream() .map(item -> new Channel_Show_Model(item.getTitle(), item.getMessage(), item.getStatus())) .collect(Collectors.toList()));
优化版(搭配拷贝构造函数)
如果给Channel_Show_Model添加一个拷贝构造函数,代码会更干净:
// 先给Channel_Show_Model添加拷贝构造函数 public class Channel_Show_Model implements Parcelable { // 原有代码... public Channel_Show_Model(Channel_Show_Model original) { this.title = original.getTitle(); this.message = original.getMessage(); this.status = original.getStatus(); } }
然后复制代码可以简化为:
data.addAll(items.stream() .map(Channel_Show_Model::new) .collect(Collectors.toList()));
3. 传统写法简化:增强for循环
如果不想用Stream API,也可以用增强for循环替代普通for循环,减少代码冗余:
ArrayList<Channel_Show_Model> items = getIntent().getParcelableArrayListExtra(FORWARDED_ITEMS_FROM_MAIN); for (Channel_Show_Model item : items) { data.add(new Channel_Show_Model(item.getTitle(), item.getMessage(), item.getStatus())); }
总结
- 优先选
addAll():当允许浅拷贝时,这是最简单高效的方案; - 深拷贝选Stream API:代码更简洁,可读性更好,搭配拷贝构造函数体验更佳;
- 增强for循环:传统写法里的简化版,适合不熟悉Stream的场景。
内容的提问来源于stack exchange,提问作者amir dt
相关产品推荐
相关产品推荐

