快速复制两个list

Part1 

在 Java 17 中,有几种方法可以快速复制两个列表(List)。以下是几种常用的方法:

1. 使用 new ArrayList<>(originalList)

这是最常见和最简单的方法,可以创建一个新的 ArrayList 实例,并将原始列表中的所有元素复制到新列表中。

import java.util.ArrayList;
import java.util.List;

public class ListCopyExample {
    public static void main(String[] args) {
        List<String> originalList = new ArrayList<>();
        originalList.add("A");
        originalList.add("B");
        originalList.add("C");

        List<String> copiedList = new ArrayList<>(originalList);

        // 打印两个列表以验证它们的内容
        System.out.println("Original List: " + originalList);
        System.out.println("Copied List: " + copiedList);
    }
}

2. 使用 List.of 和 stream

如果你想要一个不可变的列表副本,你可以使用 List.of 创建一个不可变的视图,然后使用 stream 将其转换为可变列表(如果需要)。

import java.util.List;
import java.util.stream.Collectors;

public class ListCopyExample {
    public static void main(String[] args) {
        List<String> originalList = List.of("A", "B", "C");

        // 创建一个新的可变列表副本
        List<String> copiedList = originalList.stream()
                                              .collect(Collectors.toList());

        // 打印两个列表以验证它们的内容
        System.out.println("Original List: " + originalList);
        System.out.println("Copied List: " + copiedList);
    }
}

3. 使用 addAll 方法

你也可以创建一个空的 ArrayList,然后使用 addAll 方法将原始列表的元素添加到新列表中。

import java.util.ArrayList;
import java.util.List;

public class ListCopyExample {
    public static void main(String[] args) {
        List<String> originalList = new ArrayList<>();
        originalList.add("A");
        originalList.add("B");
        originalList.add("C");

        List<String> copiedList = new ArrayList<>();
        copiedList.addAll(originalList);

        // 打印两个列表以验证它们的内容
        System.out.println("Original List: " + originalList);
        System.out.println("Copied List: " + copiedList);
    }
}

4. 使用 Collections.copy 方法(适用于固定大小的列表)

Collections.copy 方法可以将一个列表复制到另一个列表,但目标列表必须足够大以容纳原始列表的所有元素,并且其大小是固定的。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class ListCopyExample {
    public static void main(String[] args) {
        List<String> originalList = Arrays.asList("A", "B", "C");

        // 创建一个足够大的目标列表
        List<String> copiedList = new ArrayList<>(Collections.nCopies(originalList.size(), null));

        // 使用 Collections.copy 方法复制列表
        Collections.copy(copiedList, originalList);

        // 打印两个列表以验证它们的内容
        System.out.println("Original List: " + originalList);
        System.out.println("Copied List: " + copiedList);
    }
}

注意:Collections.copy 方法要求目标列表在调用 copy 方法时具有足够的空间(即大小等于或大于源列表的大小),否则会抛出 IndexOutOfBoundsException

总结

在大多数情况下,第一种方法(使用 new ArrayList<>(originalList))是最简单和最高效的。如果你需要处理不可变列表或特定大小的列表,其他方法可能更适合。

Part2 BeanUtil.copyToList

在Hutool工具包中,BeanUtil.copyToList 方法确实存在,并且它是用来将一个对象列表中的属性值复制到另一个类型的对象列表中的。Hutool是一个Java工具包,它提供了很多实用的工具类来简化开发。

BeanUtil.copyToList 方法通常用于将一种类型的JavaBean对象列表转换为另一种具有相同或相似属性的JavaBean对象列表。这个过程是基于属性名和类型的匹配来进行的。

以下是一个使用BeanUtil.copyToList方法的示例:

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import java.util.List;
import java.util.ArrayList;

// 定义源Bean类
class SourceBean {
    private String name;
    private int age;
    // getters and setters
}

// 定义目标Bean类
class TargetBean {
    private String name;
    private int age;
    // getters and setters
}

public class BeanCopyExample {
    public static void main(String[] args) {
        // 创建源Bean列表
        List<SourceBean> sourceList = new ArrayList<>();
        SourceBean source1 = new SourceBean();
        source1.setName("Alice");
        source1.setAge(30);
        sourceList.add(source1);

        SourceBean source2 = new SourceBean();
        source2.setName("Bob");
        source2.setAge(25);
        sourceList.add(source2);

        // 使用Hutool的BeanUtil.copyToList方法复制属性到目标Bean列表
        List<TargetBean> targetList = BeanUtil.copyToList(sourceList, TargetBean.class);

        // 输出目标Bean列表以验证复制结果
        for (TargetBean target : targetList) {
            System.out.println("Name: " + target.getName() + ", Age: " + target.getAge());
        }
    }
}

在这个示例中,我们首先创建了一个SourceBean类型的列表,并填充了一些数据。然后,我们使用BeanUtil.copyToList方法将这个列表中的对象复制到TargetBean类型的列表中。由于SourceBeanTargetBean具有相同的属性名和类型,所以它们的属性值被正确地复制了。

需要注意的是,BeanUtil.copyToList方法要求源对象和目标对象具有相同的属性名,并且这些属性的类型必须兼容。如果属性名不匹配或类型不兼容,那么这些属性将不会被复制。

此外,Hutool的BeanUtil类还提供了其他有用的方法,如copyProperties(用于复制单个对象的属性)和toMap(用于将对象的属性转换为Map)等。这些方法都可以帮助开发者更方便地进行JavaBean对象的操作。

 

--end--

### 如何在Java复制一个列表 在Java中,可以通过多种方式实现将一个`List`中的元素复制一个`List`。以下是几种常见的方法及其优缺点。 #### 方法一:使用 `Collections.copy()` 方法 `Collections.copy()` 是一种简单的方法来完成两个相同大小的列表之间的数据复制操作。需要注意的是,在调用此方法之前,目标列表必须具有足够的容量以容纳源列表的所有元素[^1]。如果两者的长度不匹配,则会抛出异常。 ```java import java.util.ArrayList; import java.util.Collections; import java.util.List; public class CopyExample { public static void main(String[] args) { List<String> source = new ArrayList<>(); source.add("A"); source.add("B"); List<String> destination = new ArrayList<>(Collections.nCopies(source.size(), null)); // 执行拷贝动作 Collections.copy(destination, source); System.out.println("Destination List: " + destination); } } ``` 注意这里创建了一个初始填充为null的新ArrayList实例作为destination参数传递给nCopies函数,从而确保它拥有正确的尺寸以便后续执行copy命令时不发生错误。 #### 方法二:通过流API与Collectors工具类 自JDK 8起引入了强大的Stream API以及配套使用的Collector接口,它们可以非常方便地处理集合类型的转换工作。下面展示了一种当存在键冲突时如何解决的办法——即指定合并策略[(oldValue,value)->oldValue][^2]: ```java import java.util.*; import java.util.stream.Collectors; class ClazzDuplicateKeyInCollectMap{ private int key; private int value; public ClazzDuplicateKeyInCollectMap(int key,int value){ this.key=key; this.value=value; } public Integer getKey(){ return key; } @Override public String toString(){ return "{key="+this.key+",value="+this.value+"}"; } } public class StreamCopyExample { public static void main(String []args){ List<ClazzDuplicateKeyInCollectMap> list=Arrays.asList( new ClazzDuplicateKeyInCollectMap(1,10), new ClazzDuplicateKeyInCollectMap(1,20), new ClazzDuplicateKeyInCollectMap(2,30)); Map<Integer,ClazzDuplicateKeyInCollectMap> map=list.stream() .collect(Collectors.toMap(e->e.getKey(),e->e,(ov,v)->v)); System.out.println(map.values()); } } ``` 上述例子展示了即使遇到重复keys的情况也能妥善解决问题,并且最终只保留最后出现的那个entry项[^2]。 #### 方法三:利用构造器初始化新对象 最直接的方式就是借助于某些特定容器类自带的支持传入其他Collection类型实例的公共构造子形式来进行深浅度不同的克隆过程。例如对于ArrayList而言,其提供了接受任意Collection类型变量作为唯一形参的形式化定义之一;而对于HashSet来说也是如此等等... ```java // 创建原始列表 List<String> original = Arrays.asList("apple", "banana", "cherry"); // 使用构造器进行复制 List<String> copied = new ArrayList<>(original); System.out.println(copied); // 输出结果应同原表一致 ``` 这种方法的优点在于简洁明了易于理解同时也适用于绝大多数场景需求之下快速达成目的。 --- ### 总结 以上介绍了三种主流技术手段用于实现在Java环境下由一个已知list外新建的一个list实施成员级别的迁移任务。每种方案都有各自适用范围及局限性所在,请依据实际开发环境选取最适合当前项目的技术路线加以应用实践即可获得满意效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值