Skip to content

Java数据转换工具类

从2020年左右开始就一直在使用的自己写的一个用于Springboot项目中数据类型之间相互转换的一个工具类,可以完全替代MapStruct(当时写工具类的时候还不知道有这么个奇怪又不好用的的东西存在)。之前都是从一个项目复制到另一个项目,然后更新也没有完全同步,所以特此记录。之后的版本更新也会在这里更新,方便复制。

java
package io.tomoto.utils;

import org.springframework.beans.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 数据工具
 *
 * @author Tomoto
 * @version 1.4
 */
public class DataTransformUtil {
    /**
     * 数据复制
     *
     * @param origin     原始数据
     * @param targetType 目标数据类型
     * @param then       后操作
     * @param <O>        原始数据类型
     * @param <T>        目标数据类型
     * @return 目标类型数据
     */
    public static <O, T> T transform(O origin, Class<T> targetType, BiConsumer<O, T> then) {
        if (origin == null) {
            return null;
        }
        try {
            T t = targetType.getDeclaredConstructor().newInstance();
            BeanUtils.copyProperties(origin, t);
            then.accept(origin, t);
            return t;
        } catch (NoSuchMethodException |
                 InstantiationException |
                 IllegalAccessException |
                 InvocationTargetException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 数据复制
     *
     * @param origin     原始数据
     * @param targetType 目标数据类型
     * @param <O>        原始数据类型
     * @param <T>        目标数据类型
     * @return 目标类型数据
     */
    public static <O, T> T transform(O origin, Class<T> targetType) {
        return transform(origin, targetType, (o, t) -> {
        });
    }

    /**
     * List 数据复制
     *
     * @param originList 原始数据 List
     * @param targetType 目标数据类型
     * @param then       后操作
     * @param <O>        原始数据类型
     * @param <T>        目标数据类型
     * @return 目标类型数据 List
     */
    public static <O, T> List<T> listTransform(List<O> originList, Class<T> targetType, BiConsumer<O, T> then) {
        return originList.stream().map(o -> transform(o, targetType, then)).collect(Collectors.toList());
    }

    /**
     * List 数据复制
     *
     * @param originList 原始数据 List
     * @param targetType 目标数据类型
     * @param <O>        原始数据类型
     * @param <T>        目标数据类型
     * @return 目标类型数据 List
     */
    public static <O, T> List<T> listTransform(List<O> originList, Class<T> targetType) {
        return listTransform(originList, targetType, (o, t) -> {
        });
    }

    /**
     * List 转 Map
     *
     * @param list      原始数据 List
     * @param keyGetter Key 字段 Getter
     * @param <T>       数据类型
     * @param <K>       Key 数据类型
     * @return 以keyGetter对应field为key,值为原始数据的map
     */
    public static <T, K> Map<K, T> listToMap(List<T> list, Function<T, K> keyGetter) {
        return listToMap(list, keyGetter, Function.identity());
    }

    /**
     * List 转 Map
     *
     * @param list        原始数据 List
     * @param keyGetter   Key 字段 Getter
     * @param valueGetter Value 字段 Getter
     * @param <T>         数据类型
     * @param <K>         Key 数据类型
     * @param <U>         Value 数据类型
     * @return 以keyGetter对应field为key,valueGetter对应值为value的map
     */
    public static <T, K, U> Map<K, U> listToMap(List<T> list, Function<T, K> keyGetter, Function<T, U> valueGetter) {
        return list.stream().collect(Collectors.toMap(keyGetter, valueGetter));
    }
}