From e46c5e1c0cb1e0ba39c39d4582881914b6d0b6bd Mon Sep 17 00:00:00 2001 From: scruel Date: Tue, 30 Nov 2021 11:02:42 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20add=20removeWithAddIf=20methods?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/collection/CollUtil.java | 40 +++++++++++++++++++ .../hutool/core/collection/CollUtilTest.java | 17 ++++++++ 2 files changed, 57 insertions(+) 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 f031f4bc8..329c37d5d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java @@ -1291,6 +1291,46 @@ public class CollUtil { return filter(collection, StrUtil::isNotBlank); } + /** + * 移除集合中的多个元素,并将结果存放到指定的集合 + * 此方法直接修改原集合 + * + * @param 集合类型 + * @param 集合元素类型 + * @param resultCollection 存放移除结果的集合 + * @param targetCollection 被操作移除元素的集合 + * @param filter 用于是否移除判断的过滤器 + */ + public static , E> T removeWithAddIf(T targetCollection, T resultCollection, Predicate filter) { + Objects.requireNonNull(filter); + final Iterator each = targetCollection.iterator(); + while (each.hasNext()) { + E next = each.next(); + if (filter.test(next)) { + resultCollection.add(next); + each.remove(); + } + } + return resultCollection; + } + + /** + * 移除集合中的多个元素,并将结果存放到生成的新集合中后返回 + * 此方法直接修改原集合 + * + * @param 集合类型 + * @param 集合元素类型 + * @param targetCollection 被操作移除元素的集合 + * @param filter 用于是否移除判断的过滤器 + * @return 移除结果的集合 + */ + @SuppressWarnings("unchecked") + public static , E> T removeWithAddIf(T targetCollection, Predicate filter) { + Collection resultCollection = new ArrayList<>(); + removeWithAddIf(targetCollection, resultCollection, filter); + return (T) resultCollection; + } + /** * 通过Editor抽取集合元素中的某些值返回为新列表
* 例如提供的是一个Bean列表,通过Editor接口实现获取某个字段值,返回这个字段值组成的新列表 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 20574da8a..833d4a79b 100644 --- a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java @@ -39,6 +39,23 @@ public class CollUtilTest { Assert.assertFalse(CollUtil.contains(list, s -> s.startsWith("d"))); } + @Test + public void testRemoveWithAddIf() { + ArrayList list = CollUtil.newArrayList(1, 2, 3); + ArrayList exceptRemovedList = CollUtil.newArrayList(2, 3); + ArrayList exceptResultList = CollUtil.newArrayList(1); + + ArrayList resultList = CollUtil.removeWithAddIf(list, ele -> 1 == ele); + Assert.assertEquals(list, exceptRemovedList); + Assert.assertEquals(resultList, exceptResultList); + + list = CollUtil.newArrayList(1, 2, 3); + resultList = new ArrayList<>(); + CollUtil.removeWithAddIf(list, resultList, ele -> 1 == ele); + Assert.assertEquals(list, exceptRemovedList); + Assert.assertEquals(resultList, exceptResultList); + } + @Test public void testPadLeft() { List srcList = CollUtil.newArrayList();