diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java
index 1c55791e9..37b70e4ff 100755
--- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java
@@ -2075,6 +2075,32 @@ public class CollUtil {
return IterUtil.toMap(null == values ? null : values.iterator(), map, keyFunc, valueFunc);
}
+ /**
+ * 一个对象不为空且不存在于该集合中时,加入到该集合中
+ *
+ * null, null => false
+ * [], null => false
+ * null, "123" => false
+ * ["123"], "123" => false
+ * [], "123" => true
+ * ["456"], "123" => true
+ * [Animal{"name": "jack"}], Dog{"name": "jack"} => true
+ *
+ * @param collection 被加入的集合
+ * @param object 要添加到集合的对象
+ * @param 集合元素类型
+ * @param 要添加的元素类型【为集合元素类型的类型或子类型】
+ * @return 是否添加成功
+ * @author Cloud-Style
+ */
+ public static boolean addIfAbsent(Collection collection, S object) {
+ if (object == null || collection == null || collection.contains(object)) {
+ return false;
+ }
+
+ return collection.add(object);
+ }
+
/**
* 将指定对象全部加入到集合中
* 提供的对象如果为集合类型,会自动转换为目标元素类型
diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java
index 19d0f1114..4dd3c556e 100755
--- a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java
@@ -7,6 +7,9 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
import org.junit.Assert;
import org.junit.Test;
@@ -745,6 +748,24 @@ public class CollUtilTest {
Assert.assertEquals("d", map.get("keyd"));
}
+ @Test
+ public void addIfAbsentTest() {
+ // 为false的情况
+ Assert.assertFalse(CollUtil.addIfAbsent(null, null));
+ Assert.assertFalse(CollUtil.addIfAbsent(CollUtil.newArrayList(), null));
+ Assert.assertFalse(CollUtil.addIfAbsent(null, "123"));
+ Assert.assertFalse(CollUtil.addIfAbsent(CollUtil.newArrayList("123"), "123"));
+ Assert.assertFalse(CollUtil.addIfAbsent(CollUtil.newArrayList(new Animal("jack", 20)),
+ new Animal("jack", 20)));
+
+ // 正常情况
+ Assert.assertTrue(CollUtil.addIfAbsent(CollUtil.newArrayList("456"), "123"));
+ Assert.assertTrue(CollUtil.addIfAbsent(CollUtil.newArrayList(new Animal("jack", 20)),
+ new Dog("jack", 20)));
+ Assert.assertTrue(CollUtil.addIfAbsent(CollUtil.newArrayList(new Animal("jack", 20)),
+ new Animal("tom", 20)));
+ }
+
@Test
public void mapToMapTest(){
final HashMap oldMap = new HashMap<>();
@@ -951,4 +972,22 @@ public class CollUtilTest {
private String gender;
private Integer id;
}
+
+ @Data
+ @AllArgsConstructor
+ @NoArgsConstructor
+ static class Animal {
+ private String name;
+ private Integer age;
+ }
+
+ @ToString(callSuper = true)
+ @EqualsAndHashCode(callSuper = true)
+ @Data
+ static class Dog extends Animal {
+
+ public Dog(String name, Integer age) {
+ super(name, age);
+ }
+ }
}