Java中常用拷贝

1,256 阅读1分钟

Java对象拷贝

常用org.springframework.beans.BeanUtils的copyProperties(Object source, Object target)

Apache的commons-beanutils-1.8.3.jar 也可以完成对象的拷贝

注意:Apache的方法和Spring的用法相反,左边为目标对象,右边为源对象.

1 使用Spring提供BeanUtils

0 导入pom.xml坐标

       <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>
	  <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.3.2</version>
        </dependency>

1 准备对象

@Data
public class UserDO {
    private String id;
    private String userName;
    private Integer age;
}
@Data
public class UserVO {
    private String id;
    private String userName;
    private String age;
}

2 单元测试

    @Test
    public void commonCopy() {
        UserDO userDO = new UserDO("001", "Van",  18);
        UserVO userVO = new UserVO();
        BeanUtils.copyProperties(userDO, userVO);
        System.out.println(userVO);
    }
	/**
	*UserVO(id=001, userName=Van, age=null)
	* 类型不同,不能拷贝
	*/

2使用Apache的BeanUtils

0 导入Pom.xml坐标

        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.8.3</version>
        </dependency>

1 单元测试

    @Test
    public void commonCopy2() throws Exception {
        UserDO userDO = new UserDO("001", "Van", 18);
        UserVO userVO = new UserVO();
	    org.apache.commons.beanutils.BeanUtils.copyProperties(userVO,userDO);
        System.out.println(userVO);
    }

集合拷贝

常见在业务层,将DTO数据和POJO对象,拷贝数据.

1 遍历集合,使用BeanUtils拷贝每一个对象

    @Test
    public void listCopyCommon() {
        List<UserDO> userDOList = new ArrayList();
        userDOList.add(new UserDO("002", "Van", 18));
        userDOList.add(new UserDO("003", "VanVan", 20));
        List<UserVO> userVOList = new ArrayList();
        userDOList.forEach(userDO -> {
            UserVO userVO = new UserVO();
            BeanUtils.copyProperties(userDO, userVO);
            userVOList.add(userVO);
        });
        System.out.println(userVOList);
    }

2 使用alibabafastjson

0 导入pom.xml坐标

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.72</version>
            <scope>compile</scope>
        </dependency>

1 单元测试

    @Test
    public void listCopyUp2() {
        List userDOList = new ArrayList();
        userDOList.add(new UserDO(1L, "Van", 18, 1));
        userDOList.add(new UserDO(2L, "VanVan", 20, 2));
        List userVOList = JSON.parseArray(JSON.toJSONString(userDOList), UserVO.class);
        
        System.out.println(userVOList);
    }

3 使用mapstruct

1 添加pom.xml坐标

        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.3.1.Final</version>
        </dependency>

        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.3.1.Final</version>
        </dependency>

2 创建一个转换的接口

@Mapper
public interface UserConverter {
    UserConverter INSTANCE = Mappers.getMapper(UserConverter.class);

    List<UserVO> listVo2dto(List<UserDO> vos);
}

3 单元测试

    @Test
    public void listCopyUp3() {
        List userDOList = new ArrayList();
        userDOList.add(new UserDO("003", "Van", 18));
        userDOList.add(new UserDO("004", "VanVan", 20));
        List list = UserConverter.INSTANCE.listVo2dto(userDOList);

        System.out.println(list);
    }