diff --git a/java/src/main/java/euler/lib/Primes.java b/java/src/main/java/euler/lib/Primes.java index 994d4436..4c1969e7 100644 --- a/java/src/main/java/euler/lib/Primes.java +++ b/java/src/main/java/euler/lib/Primes.java @@ -4,6 +4,8 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Spliterator; +import java.util.Spliterators; import java.util.function.Consumer; import java.util.stream.Stream; import java.util.stream.StreamSupport; @@ -24,15 +26,47 @@ private static class Cache { // Generate an infinite stream of primes public static Stream primes() { - return StreamSupport.stream(new PrimeIterator(null), false); + return StreamSupport.stream(new PrimeSpliterator(null), false); } // Generate a stream of primes up to a given limit public static Stream primesUntil(Long limit) { - return StreamSupport.stream(new PrimeIterator(limit), false); + return StreamSupport.stream(new PrimeSpliterator(limit), false); } - private static class PrimeIterator implements Iterator, Iterable { + private static class PrimeSpliterator implements Spliterator { + private final PrimeIterator primeIterator; + + PrimeSpliterator(Long limit) { + primeIterator = new PrimeIterator(limit); + } + + @Override + public boolean tryAdvance(Consumer action) { + if (primeIterator.hasNext()) { + action.accept(primeIterator.next()); + return true; + } + return false; + } + + @Override + public Spliterator trySplit() { + return null; // Sequential iteration only + } + + @Override + public long estimateSize() { + return Long.MAX_VALUE; // Unknown size + } + + @Override + public int characteristics() { + return ORDERED | SIZED | IMMUTABLE | NONNULL; + } + } + + private static class PrimeIterator implements Iterator { private final Long limit; private Iterator primeGenerator; private boolean exhausted = false; // Flag to indicate if we have exhausted all primes @@ -81,11 +115,6 @@ public Long next() { primeGenerator = new PrimeGeneratorIterator(); } } - - @Override - public Iterator iterator() { - return this; - } } private static class PrimeGeneratorIterator implements Iterator { @@ -102,7 +131,7 @@ private static class PrimeGeneratorIterator implements Iterator { sieve.put(prime, step); step = prime * 2; }); - recursivePrimes = new PrimeIterator(); + recursivePrimes = new PrimeIterator(null); if (recursivePrimes.hasNext()) { currentPrime = recursivePrimes.next(); }