-
-
Notifications
You must be signed in to change notification settings - Fork 305
/
CloneUtils.java
124 lines (114 loc) · 3.75 KB
/
CloneUtils.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package dev.utils.common;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import dev.utils.JCLogUtils;
/**
* detail: 克隆工具类
* @author Ttt
*/
public final class CloneUtils {
private CloneUtils() {
}
// 日志 TAG
private static final String TAG = CloneUtils.class.getSimpleName();
/**
* 进行克隆
* @param data Object implements {@link Serializable}
* @param <T> 泛型
* @return 克隆后的对象
*/
public static <T> T deepClone(final Serializable data) {
if (data == null) return null;
return (T) ConvertUtils.bytesToObject(serializableToBytes(data));
}
/**
* 通过序列化实体类, 获取对应的 byte[] 数据
* @param serializable Object implements {@link Serializable}
* @return 克隆后 byte[]
*/
public static byte[] serializableToBytes(final Serializable serializable) {
if (serializable == null) return null;
ObjectOutputStream oos = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(serializable);
return baos.toByteArray();
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "serializableToBytes");
return null;
} finally {
CloseUtils.closeIOQuietly(oos);
}
}
// =
/**
* 进行克隆
* @param map 存储集合
* @param values 需要克隆的数据源
* @param <K> key
* @param <V> value
* @return {@code true} success, {@code false} fail
*/
public static <K, V> boolean deepClone(
final Map<K, V> map,
final Map<K, V> values
) {
if (map != null && values != null && values.size() > 0) {
Iterator<Map.Entry<K, V>> iterator = values.entrySet().iterator();
while (iterator.hasNext()) {
try {
Map.Entry<K, V> entry = iterator.next();
// 获取 key
K key = entry.getKey();
// 克隆对象
V cloneObj = (V) ConvertUtils.bytesToObject(
serializableToBytes((Serializable) entry.getValue())
);
if (cloneObj != null) {
// 保存到集合
map.put(key, cloneObj);
}
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "deepClone");
}
}
return true;
}
return false;
}
/**
* 进行克隆
* @param collection 存储集合
* @param values 需要克隆的数据源
* @param <T> 泛型
* @return {@code true} success, {@code false} fail
*/
public static <T> boolean deepClone(
final Collection<T> collection,
final Collection<T> values
) {
if (collection != null && values != null && values.size() > 0) {
Iterator<T> iterator = values.iterator();
while (iterator.hasNext()) {
try {
// 克隆对象
T cloneObj = (T) ConvertUtils.bytesToObject(
serializableToBytes((Serializable) iterator.next())
);
if (cloneObj != null) {
collection.add(cloneObj);
}
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "deepClone");
}
}
return true;
}
return false;
}
}