Skip to content

Commit 89203bd

Browse files
committed
加入测试用例
完善注释
1 parent a4a87cc commit 89203bd

File tree

9 files changed

+215
-23
lines changed

9 files changed

+215
-23
lines changed

pom.xml

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>cn.winggon</groupId>
8+
<artifactId>utils</artifactId>
9+
<version>0.0.1-SNAPSHOT</version>
10+
<packaging>jar</packaging>
11+
12+
13+
<dependencies>
14+
15+
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
16+
<dependency>
17+
<groupId>com.google.code.gson</groupId>
18+
<artifactId>gson</artifactId>
19+
<version>2.8.6</version>
20+
</dependency>
21+
22+
</dependencies>
23+
24+
<build>
25+
<plugins>
26+
<plugin>
27+
<groupId>org.apache.maven.plugins</groupId>
28+
<artifactId>maven-compiler-plugin</artifactId>
29+
<version>3.6.2</version>
30+
<configuration>
31+
<encoding>utf-8</encoding>
32+
<source>1.8</source>
33+
<target>1.8</target>
34+
</configuration>
35+
</plugin>
36+
</plugins>
37+
</build>
38+
39+
<properties>
40+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
41+
</properties>
42+
43+
</project>

src/main/java/cn/winggon/ListUtils.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public static <T> List<T> cloneTo(Collection<?> list, Class<T> clazz) {
2525
}
2626

2727
/**
28-
* 审核拷贝集合内所有元素
28+
* 深度拷贝集合内所有元素
2929
*/
3030
public static <T> List<T> deepClone(Collection<T> list) {
3131
if (isEmpty(list)) {

src/main/java/cn/winggon/MapUtils.java

+17-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package cn.winggon;
22

3-
import java.util.Collection;
4-
import java.util.Collections;
5-
import java.util.HashMap;
6-
import java.util.Map;
3+
import java.util.*;
74
import java.util.function.Function;
85

96
/**
@@ -59,6 +56,22 @@ Map<K, T> objMapping(Collection<T> list, Function<T, K> keyMpper) {
5956
return result;
6057
}
6158

59+
/**
60+
* 按规则key进行聚合分组
61+
*/
62+
public static <T, K> Map<K, List<T>> objGrouping(Collection<T> list, Function<T, K> keyMpper) {
63+
if (ListUtils.isEmpty(list)) {
64+
return new HashMap<>(0);
65+
}
66+
Map<K, List<T>> result = new HashMap<>(guessSize(list));
67+
for (T t : list) {
68+
if (t != null) {
69+
result.computeIfAbsent(keyMpper.apply(t), k -> new ArrayList<>()).add(t);
70+
}
71+
}
72+
return result;
73+
}
74+
6275
/**
6376
* 根据来源估计HashMap的初始化大小值
6477
*/

src/main/java/cn/winggon/ObjUtils.java

+31-18
Original file line numberDiff line numberDiff line change
@@ -24,31 +24,46 @@ public static <T> T deepCopy(T sourceObj) {
2424
/**
2525
* 深度拷贝单个对象
2626
*
27+
* 如果被拷贝对象里含有多引用情况,拷贝出来的对象会丢失这种关联
28+
* 比方说sourceObj对象里面有集合listA和listB, 有一对象a同时存在于listA、listB, 众所周知对listA里的a进行修改,B里面的a也会被变化
29+
* 被此方法深度拷贝出来的listA和listB里的"a"将会是分别独立存在的,对listA的"a"进行修改,B里面的"a"不会被变化
30+
*
2731
* @param sourceObj 被拷贝对象
28-
* @param targetObj 拷贝到目标类类型
32+
* @param targetObjClz 拷贝到目标类类型
2933
*/
30-
public static <T> T deepCopy(Object sourceObj, Class<T> targetObj) {
31-
T t;
34+
public static <T> T deepCopy(Object sourceObj, Class<T> targetObjClz) {
35+
36+
if (sourceObj instanceof Collection) {
37+
return (T) ListUtils.deepClone((Collection) sourceObj);
38+
} else if (sourceObj instanceof Map) {
39+
return (T) MapUtils.deepClone((Map) sourceObj);
40+
}
41+
42+
T target;
3243
try {
33-
t = targetObj.newInstance();
44+
target = targetObjClz.newInstance();
3445
} catch (InstantiationException |IllegalAccessException e) {
3546
e.printStackTrace();
3647
return null;
3748
}
38-
Map<String, Field> sourceObjFieldMapping = getFieldMapping(sourceObj.getClass());
39-
Map<String, Field> targetObjFieldMapping = getFieldMapping(targetObj);
40-
for (Field targetField : targetObjFieldMapping.values()) {
41-
Field sourceField = sourceObjFieldMapping.get(targetField.getName());
49+
50+
Map<String, Field> s = getFieldMapping(sourceObj.getClass());
51+
Map<String, Field> t = getFieldMapping(targetObjClz);
52+
for (Field targetField : t.values()) {
53+
54+
// 源对象存在跟目标对象同样名称的字段
55+
Field sourceField = s.get(targetField.getName());
56+
4257
if (sourceField != null) {
4358
try {
4459
Object value = sourceField.get(sourceObj);
45-
targetField.set(t, getValueByValue(value));
60+
targetField.set(target, getValueByValue(value));
4661
} catch (IllegalAccessException e) {
4762
//
4863
}
4964
}
5065
}
51-
return t;
66+
return target;
5267
}
5368

5469
/**
@@ -60,16 +75,12 @@ private static Object getValueByValue(Object value){
6075
|| value instanceof Integer
6176
|| value instanceof Boolean
6277
|| value instanceof Long
63-
|| value instanceof Byte
64-
|| value instanceof Character
6578
|| value instanceof Short
79+
|| value instanceof Double
6680
|| value instanceof Float
67-
|| value instanceof Double) {
81+
|| value instanceof Character
82+
|| value instanceof Byte) {
6883
return value;
69-
} else if (value instanceof Collection) {
70-
return ListUtils.deepClone((Collection) value);
71-
} else if (value instanceof Map) {
72-
return MapUtils.deepClone((Map) value);
7384
}
7485
return deepCopy(value, value.getClass());
7586
}
@@ -91,9 +102,11 @@ public static Map<String, Field> getFieldMapping(Class clz) {
91102
* 递归搜集对象的所有字段
92103
*/
93104
public static void collectField(Class clz, List<Field> result) {
94-
if (!(clz instanceof Object)) {
105+
// 向上追溯父对象
106+
if (!(clz.getSuperclass() == Object.class)) {
95107
collectField(clz.getSuperclass(), result);
96108
}
109+
// 到达除Object外的最上层父对象时结束递归,开始收集字段
97110
for (Field field : clz.getDeclaredFields()) {
98111
field.setAccessible(true);
99112
result.add(field);
+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package cn.winggon;
2+
3+
import cn.winggon.po.Student;
4+
import cn.winggon.po.Teacher;
5+
6+
import java.io.IOException;
7+
import java.util.List;
8+
import java.util.Random;
9+
import java.util.stream.Collectors;
10+
import java.util.stream.Stream;
11+
12+
/**
13+
* 对象工具测试用例
14+
* <p>
15+
* Created by winggonLee on 2020/10/31
16+
*/
17+
public class ObjUtilsTest {
18+
public static void main(String[] args) throws IOException {
19+
for (int j = 0; j < 100; j++) {
20+
List<Student> studentList = Stream.iterate(0, i -> new Random().nextInt(1000)).limit(10000).map(i -> new Student(String.valueOf(i))).collect(Collectors.toList());
21+
Teacher teacher = new Teacher("Mr.k");
22+
teacher.setLike(studentList);
23+
teacher.setStuNameGroup(MapUtils.objGrouping(studentList, s -> String.valueOf(s.getName().charAt(0))));
24+
25+
long time0 = System.currentTimeMillis();
26+
Teacher teacher0 = ObjUtils.deepCopy(teacher);
27+
long time1 = System.currentTimeMillis();
28+
29+
30+
if (teacher.getLike().get(9999).getName() == teacher0.getLike().get(9999).getName()) {
31+
System.out.println(time1 - time0);
32+
}
33+
34+
System.gc();
35+
}
36+
37+
System.in.read();
38+
}
39+
}
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package cn.winggon.po;
2+
3+
/**
4+
* Created by winggonLee on 2020/10/31
5+
*/
6+
public interface Doing {
7+
void working();
8+
}

src/test/java/cn/winggon/po/Peo.java

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package cn.winggon.po;
2+
3+
/**
4+
* Created by winggonLee on 2020/10/31
5+
*/
6+
public abstract class Peo implements Doing{
7+
protected String name;
8+
9+
public String getName() {
10+
return name;
11+
}
12+
13+
public void setName(String name) {
14+
this.name = name;
15+
}
16+
}
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package cn.winggon.po;
2+
3+
/**
4+
* Created by winggonLee on 2020/10/31
5+
*/
6+
public class Student extends Peo {
7+
public Student() {
8+
}
9+
10+
public Student(String name) {
11+
this.name = name;
12+
}
13+
14+
@Override
15+
public void working() {
16+
System.out.println("student doing");
17+
}
18+
}
+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package cn.winggon.po;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
8+
/**
9+
* Created by winggonLee on 2020/10/31
10+
*/
11+
public class Teacher extends Peo{
12+
List<Student> like = new ArrayList<>();
13+
Map<String, List<Student>> stuNameGroup = new HashMap<>();
14+
15+
public Teacher() {
16+
}
17+
18+
public Teacher(String name) {
19+
this.name = name;
20+
}
21+
22+
public List<Student> getLike() {
23+
return like;
24+
}
25+
26+
public void setLike(List<Student> like) {
27+
this.like = like;
28+
}
29+
30+
public Map<String, List<Student>> getStuNameGroup() {
31+
return stuNameGroup;
32+
}
33+
34+
public void setStuNameGroup(Map<String, List<Student>> stuNameGroup) {
35+
this.stuNameGroup = stuNameGroup;
36+
}
37+
38+
@Override
39+
public void working() {
40+
System.out.println("teacher doing");
41+
}
42+
}

0 commit comments

Comments
 (0)