From b8a11d6d5b1d9f8cc9c7624d4c1d0873b953c139 Mon Sep 17 00:00:00 2001 From: Patrick Strawderman Date: Sun, 11 Sep 2022 14:13:02 -0700 Subject: [PATCH] Override ArrayTagSet::spliterator to return Spliterator with exact size Override ArrayTagSet::spliterator to return a Spliterator which reports an exact size as well as other important characteristics such as IMMUTABLE and SORTED. --- .../java/com/netflix/spectator/api/ArrayTagSet.java | 9 +++++++++ .../com/netflix/spectator/api/ArrayTagSetTest.java | 13 +++++++++++++ 2 files changed, 22 insertions(+) diff --git a/spectator-api/src/main/java/com/netflix/spectator/api/ArrayTagSet.java b/spectator-api/src/main/java/com/netflix/spectator/api/ArrayTagSet.java index 1d263fbe6..788629148 100644 --- a/spectator-api/src/main/java/com/netflix/spectator/api/ArrayTagSet.java +++ b/spectator-api/src/main/java/com/netflix/spectator/api/ArrayTagSet.java @@ -23,6 +23,8 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Spliterator; +import java.util.Spliterators; import java.util.concurrent.ConcurrentMap; import java.util.function.BiPredicate; import java.util.function.Predicate; @@ -482,4 +484,11 @@ private static int dedupInPlace(String[] data, int len) { } return builder.toString(); } + + @Override + public Spliterator spliterator() { + return Spliterators.spliterator(iterator(), size(), + (Spliterator.ORDERED | Spliterator.SORTED | Spliterator.NONNULL + | Spliterator.DISTINCT | Spliterator.IMMUTABLE)); + } } diff --git a/spectator-api/src/test/java/com/netflix/spectator/api/ArrayTagSetTest.java b/spectator-api/src/test/java/com/netflix/spectator/api/ArrayTagSetTest.java index 36c2c8169..3ccc05fb1 100644 --- a/spectator-api/src/test/java/com/netflix/spectator/api/ArrayTagSetTest.java +++ b/spectator-api/src/test/java/com/netflix/spectator/api/ArrayTagSetTest.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; +import java.util.Spliterator; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; @@ -573,4 +574,16 @@ public int size() { Assertions.assertSame(tags, updated); } + + @Test + public void spliteratorSizeAndCharacteristics() { + ArrayTagSet tags = ArrayTagSet.create("k1", "v1", "k2", "v2", "k3", "v3"); + Spliterator spliterator = tags.spliterator(); + Assertions.assertTrue(spliterator.hasCharacteristics(Spliterator.IMMUTABLE)); + Assertions.assertTrue(spliterator.hasCharacteristics(Spliterator.ORDERED)); + Assertions.assertTrue(spliterator.hasCharacteristics(Spliterator.SORTED)); + Assertions.assertTrue(spliterator.hasCharacteristics(Spliterator.NONNULL)); + Assertions.assertTrue(spliterator.hasCharacteristics(Spliterator.SIZED)); + Assertions.assertEquals(3L, spliterator.getExactSizeIfKnown()); + } }