All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.moon.core.util.MapperUtil Maven / Gradle / Ivy

package com.moon.core.util;

import com.moon.core.beans.BeanInfoUtil;
import com.moon.core.lang.ThrowUtil;
import com.moon.core.lang.reflect.ConstructorUtil;
import com.moon.core.util.converter.TypeCaster;

import java.util.*;

import static com.moon.core.beans.BeanInfoUtil.getFieldDescriptorsMap;
import static com.moon.core.lang.ThrowUtil.noInstanceError;
import static com.moon.core.lang.reflect.ConstructorUtil.newInstance;

/**
 * 映射器:提供实体到 Map,实体到另一个实体,实体到类,Map 到实体之间的映射
 *
 * @author moonsky
 * @see com.moon.core.sql.ResultSetUtil 提供 SQL 查询结果集到实体、数组、Map 的映射
 */
public final class MapperUtil {
    private MapperUtil() { noInstanceError(); }

    /*
     * ---------------------------------------------------------------------------
     * mapper
     * ---------------------------------------------------------------------------
     */

    public static Map toMap(Object bean) { return toMap(bean, new HashMap(16)); }

    public static Map toMap(Object bean, Map result) {
        if (bean != null) {
            getFieldDescriptorsMap(bean.getClass()).forEach((name, d) ->
                result.put(name, d.getValueIfPresent(bean, true)));
        }
        return result;
    }

    public static  T toInstance(Map data, Class type) {
        return overrideImpl(data, newInstance(type, true), type);
    }

    public static  T toInstance(E data, Class type) {
        return override(data, newInstance(type, true));
    }

    public static  T override(Map data, T bean) {
        return overrideImpl(data, bean, (Class) bean.getClass());
    }

    public static  E override(T t, E e) {
        final Class targetType = e.getClass();

        getFieldDescriptorsMap(t.getClass()).forEach((name, srcDesc) -> {
            BeanInfoUtil.ifSetterExecutorPresent(targetType, name, setDesc -> {
                setDesc.setValue(e, srcDesc.getValue(t, true), true);
            });
        });
        return e;
    }

    /*
     * ---------------------------------------------------------------------------
     * for each mapper
     * ---------------------------------------------------------------------------
     */

    public static  List> forEachToMap(Collection beanList) {
        List> result = new ArrayList<>(CollectUtil.size(beanList));
        IteratorUtil.forEach(beanList, item -> result.add(toMap(item)));
        return result;
    }

    /**
     * type 必须有一个空构造器
     *
     * @param dataList 目标数据
     * @param type 目标 bean class
     * @param  泛型
     * @return 转换后的数据集合
     */
    public static  List forEachToInstance(Collection> dataList, Class type) {
        List result = new ArrayList<>(CollectUtil.size(dataList));
        IteratorUtil.forEach(dataList, itemMap -> result.add(toInstance(itemMap, type)));
        return result;
    }

    public static  List forEachToOther(Collection dataList, Class type) {
        List result = new ArrayList<>(CollectUtil.size(dataList));
        IteratorUtil.forEach(dataList, item -> result.add(toInstance(item, type)));
        return result;
    }

    private static Object mapper(Class type) {
        return ThrowUtil.rejectAccessError();
    }

    private static Object mapper(Class type, TypeCaster converter) {
        return ThrowUtil.rejectAccessError();
    }

    /*
     * ---------------------------------------------------------------------------
     * inner mapper
     * ---------------------------------------------------------------------------
     */

    private static  T overrideImpl(Map data, T bean, Class type) {
        getFieldDescriptorsMap(type).forEach((name, desc) ->
            desc.setValueIfPresent(bean, data.get(name), true));
        return bean;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy