JAVA 集合+对象复制工具类

JAVA 集合+对象复制工具类

在这里插入图片描述

import jakarta.annotation.Nullable;

import java.util.ArrayList;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Consumer;


public class BeanUtil extends cn.hutool.core.bean.BeanUtil {

    /**
     * 数据拷贝
     */
    @Nullable
    public static <S, T> T copyProperties(S source, Class<T> tClass, BiFunction<S, T, T> function) {
        T t = copyProperties(source, tClass);
        if (t != null && function != null) {
            t = function.apply(source, t);
        }
        return t;
    }

    /**
     * 数据拷贝
     */
    public static <S, T> T copyProperties(S source, Class<T> tClass, @Nullable Consumer<T> consumer) {
        T t = copyProperties(source, tClass);
        if (t != null && consumer != null) {
            consumer.accept(t);
        }
        return t;
    }

    /**
     * 集合数据拷贝
     */
    public static <S, T> List<T> copyList(List<S> sources, Class<T> tClass) {
        return copyList(sources, tClass, result -> {
        });
    }

    /**
     * 集合数据拷贝
     */
    public static <S, T> List<T> copyList(List<S> sources, Class<T> tClass, @Nullable Consumer<T> consumer) {

        return copyList(sources, tClass, (src, target) -> {
            if (consumer != null) {
                consumer.accept(target);
            }
            return target;
        });

    }

    /**
     * 集合数据拷贝
     */
    public static <S, T> List<T> copyList(@Nullable List<S> sources, Class<T> tClass, BiFunction<S, T, T> function) {

        if (sources == null) {
            return null;
        }

        if (sources.isEmpty()) {
            return new ArrayList<>();
        }

        List<T> list = new ArrayList<>(sources.size());

        sources.forEach(src -> {
            T t = copyProperties(src, tClass, function);
            list.add(t);
        });

        return list;

    }

}
Java中,复制对象通常取决于对象的具体类型。以下是几种常见的复制对象的方法: 1. **值传递** (对于基本类型和简单类型): Java默认会进行值传递,所以当你传递一个整数、浮点数或字符串给一个方法时,实际上是复制了一个副本。 2. **深拷贝** (复杂类型): 对于引用类型,比如自定义类或集合,通常需要手动进行深拷贝。你可以通过序列化反序列化,或者使用一些库(如BeanUtils或Lombok的Copy构造器注解)来实现深拷贝。例如,使用`Serialization` API: ```java try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(originalObject); oos.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); copiedObject = ois.readObject(); } catch (IOException | ClassNotFoundException e) { // handle exceptions } ``` 3. **浅拷贝** (引用类型): 如果你只需要复制对象的引用而不需要复制内部的对象,可以使用`clone()`方法,但这仅适用于实现了`Cloneable`接口且重写了`clone()`方法的类。例如: ```java class MyClass implements Cloneable {...} MyClass original = new MyClass(); MyClass copied = original.clone(); ``` 4. **构建器模式**: 如果有公共的构造器,可以直接创建新的对象并设置相同的属性。 5. **工厂方法**: 通过工厂方法创建新的对象实例。 记住,每种方法都有其适用场景和限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

01传说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值