From 18cd705c01da46b964b00908e24bdd3e897c81e1 Mon Sep 17 00:00:00 2001 From: Ishu Patel Date: Mon, 7 Sep 2026 22:51:03 +0530 Subject: [PATCH 1/2] Avoid quadratic removal in JsonArray list views Delegate removeIf to the backing ArrayList bulk-removal implementation. --- .../com/google/gson/internal/NonNullElementWrapperList.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gson/src/main/java/com/google/gson/internal/NonNullElementWrapperList.java b/gson/src/main/java/com/google/gson/internal/NonNullElementWrapperList.java index a683c5da02..812d331945 100644 --- a/gson/src/main/java/com/google/gson/internal/NonNullElementWrapperList.java +++ b/gson/src/main/java/com/google/gson/internal/NonNullElementWrapperList.java @@ -24,6 +24,7 @@ import java.util.Objects; import java.util.RandomAccess; import java.util.Spliterator; +import java.util.function.Predicate; /** * {@link List} which wraps another {@code List} but prevents insertion of {@code null} elements. @@ -94,6 +95,11 @@ public boolean retainAll(Collection c) { return delegate.retainAll(c); } + @Override + public boolean removeIf(Predicate filter) { + return delegate.removeIf(filter); + } + @Override public boolean contains(Object o) { return delegate.contains(o); From 547b4025fdb7c41182090b25cb0acda25d83c009 Mon Sep 17 00:00:00 2001 From: Ishu Patel Date: Mon, 7 Sep 2026 22:53:27 +0530 Subject: [PATCH 2/2] Test removeIf behavior through JsonArray list views Cover duplicate matches, JSON nulls, preserved order, empty arrays, and null predicates. --- .../com/google/gson/JsonArrayAsListTest.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/gson/src/test/java/com/google/gson/JsonArrayAsListTest.java b/gson/src/test/java/com/google/gson/JsonArrayAsListTest.java index bf3b69f750..04454138dc 100644 --- a/gson/src/test/java/com/google/gson/JsonArrayAsListTest.java +++ b/gson/src/test/java/com/google/gson/JsonArrayAsListTest.java @@ -167,6 +167,38 @@ public void testClear() { assertThat(a).hasSize(0); } + @Test + public void testRemoveIf() { + JsonArray a = new JsonArray(); + a.add(1); + a.add(2); + a.add(3); + a.add(2); + a.add(JsonNull.INSTANCE); + + List list = a.asList(); + assertThat(list.removeIf(element -> element.equals(new JsonPrimitive(2)))).isTrue(); + assertThat(a.toString()).isEqualTo("[1,3,null]"); + assertThat(list.removeIf(JsonElement::isJsonNull)).isTrue(); + assertThat(a.toString()).isEqualTo("[1,3]"); + assertThat(list.removeIf(element -> false)).isFalse(); + assertThat(a.toString()).isEqualTo("[1,3]"); + assertThat(list.removeIf(element -> true)).isTrue(); + assertThat(a).isEmpty(); + assertThat(list.removeIf(element -> true)).isFalse(); + } + + @Test + public void testRemoveIfNullPredicate() { + JsonArray a = new JsonArray(); + List list = a.asList(); + assertThrows(NullPointerException.class, () -> list.removeIf(null)); + + a.add(1); + assertThrows(NullPointerException.class, () -> list.removeIf(null)); + assertThat(a.toString()).isEqualTo("[1]"); + } + @Test public void testContains() { JsonArray a = new JsonArray();