package com.inspur.customer.utils; import com.google.common.collect.Lists; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import java.util.*; import java.util.function.BiConsumer; import java.util.function.Function; /** * @author zengweijie * @version 1.0 * @date 2022/9/20 13:51 **/ @Slf4j public class BeanCopyUtils { private BeanCopyUtils() { } public static List copyList(List fromList, Class toObj) { return copyList(fromList, toObj, null); } public static List copyList(List fromList, Class toObj, BiConsumer afterPropertyCopied) { if (CollectionUtils.isEmpty(fromList)) { return Collections.emptyList(); } if (null == toObj) { log.error("Utils-->copyList:toObj is null"); return Collections.emptyList(); } List toList = Lists.newArrayListWithCapacity(fromList.size()); fromList.forEach(f -> { S t; try { t = toObj.getDeclaredConstructor().newInstance(); } catch (Exception e) { log.error(e.getMessage(), e); return; } BeanUtils.copyProperties(f, t); toList.add(t); Optional.ofNullable(afterPropertyCopied).ifPresent(c -> c.accept(f, t)); }); return toList; } public static S copy(T t, Class toObj) { return copy(t, toObj, null); } public static S copy(T t, Class toObj, BiConsumer afterPropertyCopied) { Assert.notNull(toObj, "Utils-->copy:toObj is null"); try { S s = toObj.getDeclaredConstructor().newInstance(); if (Objects.nonNull(t)) { BeanUtils.copyProperties(t, s); } Optional.ofNullable(afterPropertyCopied).ifPresent(c -> c.accept(t, s)); return s; } catch (Exception e) { log.error(e.getMessage(), e); throw new RuntimeException(e);// NOSONAR } } public static S copyIfNotNull(T t, Class toObj) { if (Objects.isNull(t)) { return null; } return copy(t, toObj); } /** * 从哈希表中获取指定键列表对应的值列表,并将列表元素转换为指定的目标类型 * * @param keyList 键列表 * @param map 哈希表 * @param toObj 指定的目标类型反射 * @param 值类型 * @param 指定目标类型 * @param 键类型 * @return 哈希表中对应键集的成员集 */ public static List getFromMap(List keyList, Map map, Class toObj) { return getFromMap(keyList, t -> t, map, toObj, null); } @Data @Builder @AllArgsConstructor @NoArgsConstructor public static class Entry { private K key; private T value; } public static List getFromMap(List keyList, Function keyConverter, Map map, Class toObj, BiConsumer, S> afterPropertyCopied) { return getFromMap(keyList, keyConverter, map, toObj, afterPropertyCopied, null); } public static List getFromMap(List keyList, Function keyConverter, Map map, Class toObj , BiConsumer, S> afterPropertyCopied, BiConsumer> onValueNotExists) { if (CollectionUtils.isEmpty(keyList)) { return Collections.emptyList(); } if (null == toObj) { log.error("Utils-->copyList:toObj is null"); return Collections.emptyList(); } List toList = Lists.newArrayListWithCapacity(keyList.size()); keyList.forEach(key -> { S s; try { s = toObj.getDeclaredConstructor().newInstance(); } catch (Exception e) { log.error(e.getMessage(), e); return; } Optional.ofNullable(map.get(keyConverter.apply(key))).ifPresentOrElse(value -> { BeanUtils.copyProperties(value, s); Optional.ofNullable(afterPropertyCopied).ifPresent(c -> c.accept(Entry.builder().key(key).value(value).build(), s)); toList.add(s); }, () -> Optional.ofNullable(onValueNotExists).ifPresent(kListBiConsumer -> kListBiConsumer.accept(key, toList))); }); return toList; } }