Генератор чисел Фибоначчи
- import java.util.PrimitiveIterator;
- import java.util.Spliterator;
- import java.util.Spliterators;
- import java.util.function.LongPredicate;
- import java.util.stream.LongStream;
- import java.util.stream.StreamSupport;
- public class FibonacciGenerator implements PrimitiveIterator.OfLong {
- private final LongPredicate predicate;
- private long beforePrevious = 0;
- private long previous = 1;
- protected FibonacciGenerator(LongPredicate predicate) {
- this.predicate = predicate;
- }
- @Override
- public long nextLong() {
- final long result = beforePrevious + previous;
- beforePrevious = previous;
- previous = result;
- return result;
- }
- @Override
- public boolean hasNext() {
- return predicate.test(beforePrevious + previous);
- }
- public static LongStream finiteStream(LongPredicate predicate) {
- return StreamSupport.longStream(Spliterators.spliteratorUnknownSize(
- new FibonacciGenerator(predicate), Spliterator.ORDERED), false);
- }
- public static LongStream infiniteStream() {
- return StreamSupport.longStream(Spliterators.spliteratorUnknownSize(
- new FibonacciGenerator(i -> true), Spliterator.ORDERED), false);
- }
- public static LongStream finiteParallelStream(LongPredicate predicate) {
- return StreamSupport.longStream(Spliterators.spliteratorUnknownSize(
- new FibonacciGenerator(predicate), Spliterator.ORDERED), true);
- }
- public static LongStream infiniteParallelStream() {
- return StreamSupport.longStream(Spliterators.spliteratorUnknownSize(
- new FibonacciGenerator(i -> true), Spliterator.ORDERED), true);
- }
- }
Генерирует конечный или бесконечный поток чисел Фибоначчи.
Пример вывода 80 чисел из бесконечного потока:
Пример вывода чётных чисел из конечного потока до 10000:
Пример вывода 80 чисел из бесконечного потока:
- FibonacciGenerator
- .infiniteStream()
- .limit(80)
- .forEach(System.out::println);
Пример вывода чётных чисел из конечного потока до 10000:
- FibonacciGenerator
- .finiteStream(p -> p < 10000)
- .filter(p -> p % 2 == 0)
- .forEach(System.out::println);