src/main/java/io/reactivex/Flowable.java
@CheckReturnValue
    @BackpressureSupport(BackpressureKind.ERROR)
    @SchedulerSupport(SchedulerSupport.CUSTOM)
    public final <U extends Collection<? super T>> Flowable<U> buffer(
            long timespan, TimeUnit unit,
            Scheduler scheduler, int count,
            Callable<U> bufferSupplier,
            boolean restartTimerOnMaxSize) {
        ObjectHelper.requireNonNull(unit, "unit is null");
        ObjectHelper.requireNonNull(scheduler, "scheduler is null");
        ObjectHelper.requireNonNull(bufferSupplier, "bufferSupplier is null");
        ObjectHelper.verifyPositive(count, "count");
        return RxJavaPlugins.onAssembly(new FlowableBufferTimed<T, U>(this, timespan, timespan, unit, scheduler, bufferSupplier, count, restartTimerOnMaxSize));
    }
@CheckReturnValue
    @BackpressureSupport(BackpressureKind.ERROR)
    @SchedulerSupport(SchedulerSupport.CUSTOM)
    public final <U extends Collection<? super T>> Flowable<U> buffer(
            long timespan, TimeUnit unit,
            Scheduler scheduler, int count,
            Callable<U> bufferSupplier,
            boolean restartTimerOnMaxSize) {
        ObjectHelper.requireNonNull(unit, "unit is null");
        ObjectHelper.requireNonNull(scheduler, "scheduler is null");
        ObjectHelper.requireNonNull(bufferSupplier, "bufferSupplier is null");
        ObjectHelper.verifyPositive(count, "count");
        return RxJavaPlugins.onAssembly(new FlowableBufferTimed<T, U>(this, timespan, timespan, unit, scheduler, bufferSupplier, count, restartTimerOnMaxSize));
    }
Returns a Flowable that emits buffers of items it collects from the source Publisher. The resulting
Publisher emits connected, non-overlapping buffers, each of a fixed duration specified by the
{@code timespan} argument as measured on the specified {@code scheduler}, or a maximum size specified by
the {@code count} argument (whichever is reached first). When the source Publisher completes, the resulting
Publisher emits the current buffer and propagates the notification from the source Publisher. Note that if the
source Publisher issues an onError notification the event is passed on immediately without first emitting the
buffer it is in the process of assembling.
<p>
<img width="640" height="320" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/buffer6.s.png" alt="">
<dl>
<dt><b>Backpressure:</b></dt>
<dd>This operator does not support backpressure as it uses time. It requests {@code Long.MAX_VALUE}
upstream and does not obey downstream requests.</dd>
<dt><b>Scheduler:</b></dt>
<dd>You specify which {@link Scheduler} this operator will use.</dd>
</dl>

@param <U> the collection subclass type to buffer into
@param timespan
the period of time each buffer collects items before it is emitted and replaced with a new
buffer
@param unit
the unit of time which applies to the {@code timespan} argument
@param scheduler
the {@link Scheduler} to use when determining the end and start of a buffer
@param count
the maximum size of each buffer before it is emitted
@param bufferSupplier
a factory function that returns an instance of the collection subclass to be used and returned
as the buffer
@param restartTimerOnMaxSize if true the time window is restarted when the max capacity of the current buffer
is reached
@return a Flowable that emits connected, non-overlapping buffers of items emitted by the source
Publisher after a fixed duration or when the buffer reaches maximum capacity (whichever occurs
first)
@see <a href="http://reactivex.io/documentation/operators/buffer.html">ReactiveX operators documentation: Buffer</a>