JeffGrigg icon

NumericStreamFactory

JeffGrigg | PRO | 09/09/18 07:25:30 AM UTC | 0 ⭐ | 885 👁️ | Never ⏰ | []
Java 5 |

0 B

|

None

|

0 👍

/

0 👎

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
import java.util.stream.Stream;
 
abstract public class NumericStreamFactory {
 
    private NumericStreamFactory() {
        throw new IllegalStateException("Not expecting to create instances of this class");
    }
 
    public static Stream<Long> getFibonacciStreamOfLongValues() {
 
        return Stream.generate(new Supplier<Long>() {
 
            private int _elementNumber = 0;
            private long _priorValueOne = 0;
            private long _priorValueTwo = 0;
            private boolean _exceedsLongValue = false;
 
            @Override
            public Long get() {
                ++_elementNumber;
 
                final long nextValue = _priorValueOne + ((_priorValueTwo == 0) ? 1 : _priorValueTwo);
                _priorValueOne = _priorValueTwo;
                _priorValueTwo = nextValue;
 
                if (nextValue < 0 || _exceedsLongValue) {
                    _exceedsLongValue = true;
                    throw new NoSuchElementException("Fibonacci element number " + _elementNumber + " exceeds the maximum value that can be held in a Java 'long' type.");
                }
 
                return nextValue;
            }
        });
    }
 
    public static Stream<BigInteger> getFibonacciStreamOfBigIntegerValues() {
 
        return Stream.generate(new Supplier<BigInteger>() {
 
            private BigInteger _priorValueOne = null;
            private BigInteger _priorValueTwo = BigInteger.ZERO;
 
            @Override
            public BigInteger get() {
 
                final BigInteger nextValue;
                if (_priorValueOne == null) {
                    nextValue = BigInteger.ONE;
                } else {
                    nextValue = _priorValueOne.add(_priorValueTwo);
                }
 
                _priorValueOne = _priorValueTwo;
                _priorValueTwo = nextValue;
 
                return nextValue;
            }
        });
    }
 
    public static Stream<Integer> getPrimeStream() {
        return Stream.generate(new Supplier<Integer>() {
            private int _lastPrime = 2 - 1;  // = one before the first known prime number
            private List<Integer> _primeNumbers = new ArrayList<>();
            @Override
            public Integer get() {
                int candidatePrime = _lastPrime + 1;
                boolean tryAnotherNumber = true;
                while (tryAnotherNumber) {
                    tryAnotherNumber = false;
                    for (final Integer factor : _primeNumbers) {
                        if (candidatePrime % factor == 0) {
                            ++candidatePrime;
                            tryAnotherNumber = true;
                            break;
                        }
                    }
                }
                _primeNumbers.add(candidatePrime);
                _lastPrime = candidatePrime;
                return candidatePrime;
            }
        });
    }
 
    public static Stream<Long> getCombinedStreamOfLongValues() {
 
        return Stream.generate(new Supplier<Long>() {
 
            private boolean nextIsPrime = false;
            final Iterator<Long> fibonacciStreamIterator = getFibonacciStreamOfLongValues().iterator();
            final Iterator<Integer> primeStreamIterator = getPrimeStream().iterator();
 
            @Override
            public Long get() {
                if (nextIsPrime) {
                    nextIsPrime = false;
                    return (long) primeStreamIterator.next();
                } else {
                    nextIsPrime = true;
                    return fibonacciStreamIterator.next();
                }
            }
        });
    }
 
    public static Stream<BigInteger> getCombinedStreamOfBigIntegerValues() {
 
        return Stream.generate(new Supplier<BigInteger>() {
 
            private boolean nextIsPrime = false;
            final Iterator<BigInteger> fibonacciStreamIterator = getFibonacciStreamOfBigIntegerValues().iterator();
            final Iterator<Integer> primeStreamIterator = getPrimeStream().iterator();
 
            @Override
            public BigInteger get() {
                if (nextIsPrime) {
                    nextIsPrime = false;
                    return new BigInteger(String.valueOf(primeStreamIterator.next()));
                } else {
                    nextIsPrime = true;
                    return fibonacciStreamIterator.next();
                }
            }
        });
    }
 
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎