diff --git a/guava-tests/test/com/google/common/collect/ListsTest.java b/guava-tests/test/com/google/common/collect/ListsTest.java index abbe3b754ae0..feec6399f6d5 100644 --- a/guava-tests/test/com/google/common/collect/ListsTest.java +++ b/guava-tests/test/com/google/common/collect/ListsTest.java @@ -61,7 +61,9 @@ import java.util.ListIterator; import java.util.NoSuchElementException; import java.util.RandomAccess; +import java.util.Spliterator; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicBoolean; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; @@ -674,6 +676,57 @@ public void testTransformHashCodeSequential() { assertEquals(SOME_STRING_LIST.hashCode(), list.hashCode()); } + @GwtIncompatible // Spliterator + public void testTransformSpliterator_delegatesCharacteristics_randomAccess() { + CopyOnWriteArrayList cowList = new CopyOnWriteArrayList(asList(1, 2, 3)); + assertEquals( + cowList.spliterator().characteristics(), + transform(cowList, i -> i).spliterator().characteristics()); + + ArrayList arrayList = new ArrayList(asList(1, 2, 3)); + assertEquals( + arrayList.spliterator().characteristics(), + transform(arrayList, i -> i).spliterator().characteristics()); + } + + @GwtIncompatible // Spliterator + public void testTransformSpliterator_delegatesCharacteristics_sequential() { + LinkedList fromList = new LinkedList(asList(1, 2, 3)); + Spliterator spliterator = transform(fromList, i -> i).spliterator(); + assertTrue(spliterator.hasCharacteristics(Spliterator.ORDERED)); + assertTrue(spliterator.hasCharacteristics(Spliterator.SIZED)); + } + + @GwtIncompatible // Spliterator, CopyOnWriteArrayList + public void testTransformSpliterator_concurrentStreamDoesNotThrow() throws Exception { + CopyOnWriteArrayList fromList = new CopyOnWriteArrayList(); + for (int i = 0; i < 1000; i++) { + fromList.add(i); + } + List view = transform(fromList, i -> i); + AtomicBoolean stop = new AtomicBoolean(); + Thread mutator = + new Thread( + () -> { + while (!stop.get()) { + for (int i = 0; i < 1000; i++) { + fromList.add(i); + } + fromList.clear(); + } + }); + mutator.setDaemon(true); + mutator.start(); + try { + for (int i = 0; i < 100; i++) { + view.stream().forEach(x -> {}); + } + } finally { + stop.set(true); + mutator.join(1000); + } + } + public void testTransformModifiableRandomAccess() { List fromList = new ArrayList(SOME_LIST); List list = transform(fromList, SOME_FUNCTION); diff --git a/guava/src/com/google/common/collect/Lists.java b/guava/src/com/google/common/collect/Lists.java index b99e592a2280..13bccfb32092 100644 --- a/guava/src/com/google/common/collect/Lists.java +++ b/guava/src/com/google/common/collect/Lists.java @@ -51,6 +51,7 @@ import java.util.NoSuchElementException; import java.util.Objects; import java.util.RandomAccess; +import java.util.Spliterator; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Predicate; import org.jspecify.annotations.Nullable; @@ -605,6 +606,12 @@ public boolean removeIf(Predicate filter) { return fromList.removeIf(element -> filter.test(function.apply(element))); } + @Override + @GwtIncompatible // Spliterator + public Spliterator spliterator() { + return CollectSpliterators.map(fromList.spliterator(), 0, function::apply); + } + @GwtIncompatible @J2ktIncompatible private static final long serialVersionUID = 0; } @@ -678,6 +685,12 @@ public int size() { return fromList.size(); } + @Override + @GwtIncompatible // Spliterator + public Spliterator spliterator() { + return CollectSpliterators.map(fromList.spliterator(), 0, function::apply); + } + @GwtIncompatible @J2ktIncompatible private static final long serialVersionUID = 0; }

AltStyle によって変換されたページ (->オリジナル) /