From 5c33f9baa533c5cc9f19ffdaeb2a3c387cc6542f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E8=91=89=20Scarlet?= <93977077+mukjepscarlet@users.noreply.github.com> Date: Fri, 23 Jan 2026 01:01:25 +0800 Subject: [PATCH 1/5] Add `JsonArray#collector` for `Stream<@Nullable JsonElement>` --- .../main/java/com/google/gson/JsonArray.java | 21 ++++++++++++++ .../java/com/google/gson/JsonArrayTest.java | 28 +++++++++++++++++++ pom.xml | 7 +++++ 3 files changed, 56 insertions(+) diff --git a/gson/src/main/java/com/google/gson/JsonArray.java b/gson/src/main/java/com/google/gson/JsonArray.java index 10b94c0dc1..91533d83e6 100644 --- a/gson/src/main/java/com/google/gson/JsonArray.java +++ b/gson/src/main/java/com/google/gson/JsonArray.java @@ -23,6 +23,8 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.stream.Collector; +import org.jspecify.annotations.Nullable; /** * A class representing an array type in JSON. An array is a list of {@link JsonElement}s each of @@ -40,6 +42,25 @@ * @author Joel Leitch */ public final class JsonArray extends JsonElement implements Iterable { + private static final Collector<@Nullable JsonElement, JsonArray, JsonArray> COLLECTOR = + Collector.of( + JsonArray::new, + JsonArray::add, + (left, right) -> { + left.addAll(right); + return left; + }); + + /** + * Returns a collector that accumulates {@link JsonElement}s into a {@code JsonArray}. + * + * @return a collector that accumulates {@link JsonElement}s into a {@code JsonArray} + * @since $next-version$ + */ + public static Collector<@Nullable JsonElement, ?, JsonArray> collector() { + return COLLECTOR; + } + private final ArrayList elements; /** Creates an empty JsonArray. */ diff --git a/gson/src/test/java/com/google/gson/JsonArrayTest.java b/gson/src/test/java/com/google/gson/JsonArrayTest.java index e6e60070af..e8e695c16f 100644 --- a/gson/src/test/java/com/google/gson/JsonArrayTest.java +++ b/gson/src/test/java/com/google/gson/JsonArrayTest.java @@ -22,6 +22,7 @@ import com.google.common.testing.EqualsTester; import com.google.gson.common.MoreAsserts; import java.math.BigInteger; +import java.util.stream.Stream; import org.junit.Test; /** @@ -354,4 +355,31 @@ public void testToString() { array.add(nestedObject); assertThat(array.toString()).isEqualTo("[null,NaN,\"a\\u0000\",[\"\\\"\"],{\"n\\u0000\":1}]"); } + + @Test + public void testCollector() { + JsonArray array = + Stream.of(new JsonPrimitive(1), new JsonArray(), null, new JsonObject()) + .collect(JsonArray.collector()); + assertThat(array).hasSize(4); + assertThat(array.get(0).getAsInt()).isEqualTo(1); + assertThat(array.get(1).isJsonArray()).isTrue(); + assertThat(array.get(2).isJsonNull()).isTrue(); + assertThat(array.get(3).isJsonObject()).isTrue(); + } + + @Test + public void testCollectorParallel() { + JsonArray array = + Stream.iterate(0, i -> i + 1) + .limit(20) + .parallel() + .map(JsonPrimitive::new) + .collect(JsonArray.collector()); + + assertThat(array).hasSize(20); + for (int i = 0; i < 20; i++) { + assertThat(array.get(i).getAsInt()).isEqualTo(i); + } + } } diff --git a/pom.xml b/pom.xml index 9b28cce683..f5d2aca093 100644 --- a/pom.xml +++ b/pom.xml @@ -81,6 +81,13 @@ + + org.jspecify + jspecify + 1.0.0 + provided + + junit junit From c4f1a60a5d0a0c9676d672f47aac48ea88b90c61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E8=91=89=20Scarlet?= <93977077+mukjepscarlet@users.noreply.github.com> Date: Fri, 23 Jan 2026 01:05:18 +0800 Subject: [PATCH 2/5] cleanup comments --- gson/src/main/java/com/google/gson/JsonArray.java | 1 - 1 file changed, 1 deletion(-) diff --git a/gson/src/main/java/com/google/gson/JsonArray.java b/gson/src/main/java/com/google/gson/JsonArray.java index 91533d83e6..c37321bf46 100644 --- a/gson/src/main/java/com/google/gson/JsonArray.java +++ b/gson/src/main/java/com/google/gson/JsonArray.java @@ -54,7 +54,6 @@ public final class JsonArray extends JsonElement implements Iterable collector() { From 38ad8234e4711539305b34304582c95762dd617e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E8=91=89=20Scarlet?= <93977077+MukjepScarlet@users.noreply.github.com> Date: Fri, 23 Jan 2026 11:21:57 +0800 Subject: [PATCH 3/5] Update Test constant Co-authored-by: Marcono1234 --- gson/src/test/java/com/google/gson/JsonArrayTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gson/src/test/java/com/google/gson/JsonArrayTest.java b/gson/src/test/java/com/google/gson/JsonArrayTest.java index e8e695c16f..0f1dc72cdf 100644 --- a/gson/src/test/java/com/google/gson/JsonArrayTest.java +++ b/gson/src/test/java/com/google/gson/JsonArrayTest.java @@ -378,7 +378,7 @@ public void testCollectorParallel() { .collect(JsonArray.collector()); assertThat(array).hasSize(20); - for (int i = 0; i < 20; i++) { + for (int i = 0; i < array.size(); i++) { assertThat(array.get(i).getAsInt()).isEqualTo(i); } } From 1629811530193eff027b453396c19dff864904f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E8=91=89=20Scarlet?= <93977077+MukjepScarlet@users.noreply.github.com> Date: Fri, 23 Jan 2026 11:31:07 +0800 Subject: [PATCH 4/5] Update test parallel stream builder Co-authored-by: Marcono1234 --- gson/src/test/java/com/google/gson/JsonArrayTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gson/src/test/java/com/google/gson/JsonArrayTest.java b/gson/src/test/java/com/google/gson/JsonArrayTest.java index 0f1dc72cdf..1f84e40030 100644 --- a/gson/src/test/java/com/google/gson/JsonArrayTest.java +++ b/gson/src/test/java/com/google/gson/JsonArrayTest.java @@ -371,10 +371,9 @@ public void testCollector() { @Test public void testCollectorParallel() { JsonArray array = - Stream.iterate(0, i -> i + 1) - .limit(20) + IntStream.range(0, 20) .parallel() - .map(JsonPrimitive::new) + .mapToObj(JsonPrimitive::new) .collect(JsonArray.collector()); assertThat(array).hasSize(20); From 8e410d341ec2bfba9472722b153fef74f5ca0f8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E8=91=89=20Scarlet?= <93977077+mukjepscarlet@users.noreply.github.com> Date: Sat, 24 Jan 2026 14:26:39 +0800 Subject: [PATCH 5/5] Update comment & import --- gson/src/main/java/com/google/gson/JsonArray.java | 2 +- gson/src/test/java/com/google/gson/JsonArrayTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/gson/src/main/java/com/google/gson/JsonArray.java b/gson/src/main/java/com/google/gson/JsonArray.java index c37321bf46..b5174155a0 100644 --- a/gson/src/main/java/com/google/gson/JsonArray.java +++ b/gson/src/main/java/com/google/gson/JsonArray.java @@ -52,7 +52,7 @@ public final class JsonArray extends JsonElement implements Iterable