Генератор чисел Фибоначчи

  1. import java.util.PrimitiveIterator;
  2. import java.util.Spliterator;
  3. import java.util.Spliterators;
  4. import java.util.function.LongPredicate;
  5. import java.util.stream.LongStream;
  6. import java.util.stream.StreamSupport;
  7.  
  8. public class FibonacciGenerator implements PrimitiveIterator.OfLong {
  9.  
  10.     private final LongPredicate predicate;
  11.     private long beforePrevious = 0;
  12.     private long previous = 1;
  13.  
  14.     protected FibonacciGenerator(LongPredicate predicate) {
  15.         this.predicate = predicate;
  16.     }
  17.  
  18.     @Override
  19.     public long nextLong() {
  20.         final long result = beforePrevious + previous;
  21.         beforePrevious = previous;
  22.         previous = result;
  23.         return result;
  24.     }
  25.  
  26.     @Override
  27.     public boolean hasNext() {
  28.         return predicate.test(beforePrevious + previous);
  29.     }
  30.  
  31.     public static LongStream finiteStream(LongPredicate predicate) {
  32.         return StreamSupport.longStream(Spliterators.spliteratorUnknownSize(
  33.                 new FibonacciGenerator(predicate), Spliterator.ORDERED), false);
  34.     }
  35.  
  36.     public static LongStream infiniteStream() {
  37.         return StreamSupport.longStream(Spliterators.spliteratorUnknownSize(
  38.                 new FibonacciGenerator(i -> true), Spliterator.ORDERED), false);
  39.     }
  40.  
  41.     public static LongStream finiteParallelStream(LongPredicate predicate) {
  42.         return StreamSupport.longStream(Spliterators.spliteratorUnknownSize(
  43.                 new FibonacciGenerator(predicate), Spliterator.ORDERED), true);
  44.     }
  45.  
  46.     public static LongStream infiniteParallelStream() {
  47.         return StreamSupport.longStream(Spliterators.spliteratorUnknownSize(
  48.                 new FibonacciGenerator(i -> true), Spliterator.ORDERED), true);
  49.     }
  50. }
Генерирует конечный или бесконечный поток чисел Фибоначчи.
Пример вывода 80 чисел из бесконечного потока:
  1. FibonacciGenerator
  2.         .infiniteStream()
  3.         .limit(80)
  4.         .forEach(System.out::println);

Пример вывода чётных чисел из конечного потока до 10000:
  1. FibonacciGenerator
  2.         .finiteStream(p -> p < 10000)
  3.         .filter(p -> p % 2 == 0)
  4.         .forEach(System.out::println);

Реклама

Мы в соцсетях

tw tg yt gt