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); + } + } }