刘仁 Java后端开发

使用自定义的BeanUtils拷贝List数组

2019-12-31
LIUREN

使用自定义的BeanUtils拷贝List数组

可以copy对象也可以copy数组

作者:liuren

链接:https://www.codepeople.cn

来源:GitHub

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

BeanHelper.java

package cn.codepeople.util;
import org.springframework.beans.BeanUtils;

import java.util.List;
import java.util.Objects;
import java.util.function.Supplier;
import java.util.stream.Collectors;


public class BeanHelper {
	/**
     * 拷贝指定源列表 到 指定目标bean类型,并返回目标bean列表
     *
     * @param targetClazz 目标bean 类型
     * @param sourceList  源bean 列表
     * @param <T>         指目标bean类型
     * @param <D>         指代源bean类型
     * @return 返回指定目标bean类型的列表
     */
    @Deprecated
    public static <T, D> List<T> copyForList(Class<T> targetClazz, List<D> sourceList) {
        if (Objects.isNull(sourceList) || Objects.isNull(targetClazz)) {
            return null;
        }
        return sourceList.stream().filter(Objects::nonNull).map(d -> {
            T t = null;
            try {
                //使用反射构建对象
                t = targetClazz.newInstance();
            } catch (InstantiationException | IllegalAccessException e) {
                e.printStackTrace();
            }
            if (Objects.nonNull(t)) {
                BeanUtils.copyProperties(d, t);
            }
            return t;
        }).filter(Objects::nonNull).collect(Collectors.toList());
    }

    /**
     * 拷贝指定源列表 到 指定目标bean类型,并返回目标bean列表
     * List<UserDto> userDtos = BeanHelper.copyForList(UserDto::new, userDos);
     * @param targetSupplier 目标bean对象提供者
     * @param sourceList     源bean 列表
     * @param <T>            指目标bean类型
     * @param <D>            指代源bean类型
     * @return 返回指定目标bean类型的列表
     */
    public static <T, D> List<T> copyForList(Supplier<T> targetSupplier, List<D> sourceList) {
        if (Objects.isNull(sourceList) || Objects.isNull(targetSupplier)) {
            return null;
        }
        return sourceList.stream().filter(Objects::nonNull).map(d ->
                BeanHelper.copyForBean(targetSupplier,d))
                .filter(Objects::nonNull).collect(Collectors.toList());
    }

    /**
     * 拷贝指定bean 到目标bean
     * 用法:
     * UserDto userDto=BeanHelper.copyForBean(UserDto::new, useDo);
     * @param targetSupplier
     * @param d
     * @param <T>
     * @param <D>
     * @return
     */
    public  static <T, D> T  copyForBean(Supplier<T> targetSupplier, D d) {
        if (Objects.isNull(targetSupplier) || Objects.isNull(d)) {
            return null;
        }
        T t = null;
        t = targetSupplier.get();
        if (Objects.nonNull(t)) {
            BeanUtils.copyProperties(d, t);
        }
        return t;
    }
}

如何使用,使用方法如下:

package cn.codepeople.util;

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

import cn.codepeople.entity.User;
import cn.codepeople.entity.UserVO;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		copyEntity();
		//JDK1.7一下使用如下方法
		List<UserVO> userVOListx =BeanHelper.copyForList(UserVO.class, copyEntity());
		System.out.println(userVOListx);
		System.out.println("============================================>>>");
		//JDK1.8使用该方法
		List<UserVO> userVOList =BeanHelper.copyForList(UserVO::new, copyEntity());
		System.out.println(userVOList);
	}

	private static List<User> copyEntity() {
		List<User> userList = new ArrayList<>();
		User user1 = new User();
		user1.setId(1);
		user1.setName("zhangsan1");
		user1.setPassword("123456");
		user1.setPerms("system:test:add");
		
		User user2 = new User();
		user2.setId(2);
		user2.setName("zhangsan2");
		user2.setPassword("123456");
		user2.setPerms("system:test:edit");
		
		userList.add(user1);
		userList.add(user2);
		return userList;
	}

}

主要注意JDK1.8和JDK1.8一下版本两种不同的调用方法

控制台打印的结果如下:

[UserVO(id=1, name=zhangsan1), UserVO(id=2, name=zhangsan2)]
============================================>>>
[UserVO(id=1, name=zhangsan1), UserVO(id=2, name=zhangsan2)]

如果类型变化会获取不到指定的值

博客地址:https://www.codepeople.cn

=====================================================================

微信公众号:


Comments

Content