Skip to content

A simple API, and a Rich API

johnmcclean-aol edited this page Oct 13, 2015 · 9 revisions

SimpleReact Streams

LazyFutureStream has all the functionality in this page.

SimpleReactStream is a simpler, more focused API with only the SimpleReact Core API features (and some extensions).

SimpleReact Core API

The core SimpleReact API remains very simple. Although it has expanded slightly since the initial release it is today :-

  • with
  • then
  • doOnEach
  • retry
  • onFail
  • capture
  • block
  • allOf
  • anyOf
  • run
  • toQueue
  • flatMap
  • peek
  • filter
  • merge

These are the concurrent non-blocking operations (except for block!) that represent the core of the API.

#java.util.stream.Stream

With SimpleReact v0.3 we have also added all the methods of the Stream api to this 👍

  • filter(Predicate<? super T>)
  • map(Function<? super T, ? extends R>)
  • mapToInt(ToIntFunction<? super T>)
  • mapToLong(ToLongFunction<? super T>)
  • mapToDouble(ToDoubleFunction<? super T>)
  • flatMap(Function<? super T, ? extends Stream<? extends R>>)
  • flatMapToInt(Function<? super T, ? extends IntStream>)
  • flatMapToLong(Function<? super T, ? extends LongStream>)
  • flatMapToDouble(Function<? super T, ? extends DoubleStream>)
  • distinct()
  • sorted()
  • sorted(Comparator<? super T>)
  • peek(Consumer<? super T>)
  • limit(long)
  • skip(long)
  • forEach(Consumer<? super T>)
  • forEachOrdered(Consumer<? super T>)
  • toArray()
  • toArray(IntFunction<A[]>)
  • reduce(T, BinaryOperator)
  • reduce(BinaryOperator)
  • reduce(U, BiFunction<U, ? super T, U>, BinaryOperator)
  • collect(Supplier, BiConsumer<R, ? super T>, BiConsumer<R, R>)
  • collect(Collector<? super T, A, R>)
  • min(Comparator<? super T>)
  • max(Comparator<? super T>)
  • count()
  • anyMatch(Predicate<? super T>)
  • allMatch(Predicate<? super T>)
  • noneMatch(Predicate<? super T>)
  • findFirst()
  • findAny()
  • builder()
  • empty()
  • of(T)
  • of(T...)
  • iterate(T, UnaryOperator)
  • generate(Supplier)
  • concat(Stream<? extends T>, Stream<? extends T>)

#org.jooq.lambda.Seq

And we have also implemented Seq, which adds the following functions

  • stream()
  • concat(Stream)
  • concat(T)
  • concat(T...)
  • cycle()
  • zip(Seq)
  • zip(Seq, BiFunction<T, U, R>)
  • zipWithIndex()
  • foldLeft(U, BiFunction<U, ? super T, U>)
  • foldRight(U, BiFunction<? super T, U, U>)
  • scanLeft(U, BiFunction<U, ? super T, U>)
  • scanRight(U, BiFunction<? super T, U, U>)
  • reverse()
  • shuffle()
  • shuffle(Random)
  • skipWhile(Predicate<? super T>)
  • skipUntil(Predicate<? super T>)
  • limitWhile(Predicate<? super T>)
  • limitUntil(Predicate<? super T>)
  • intersperse(T)
  • duplicate()
  • partition(Predicate<? super T>)
  • splitAt(long)
  • splitAtHead()
  • slice(long, long)
  • toCollection(Supplier)
  • toList()
  • toSet()
  • toMap(Function<T, K>, Function<T, V>)
  • toString(String)
  • minBy(Function<T, U>)
  • minBy(Function<T, U>, Comparator<? super U>)
  • maxBy(Function<T, U>)
  • maxBy(Function<T, U>, Comparator<? super U>)
  • ofType(Class)
  • cast(Class)
  • groupBy(Function<? super T, ? extends K>)
  • groupBy(Function<? super T, ? extends K>, Collector<? super T, A, D>)
  • groupBy(Function<? super T, ? extends K>, Supplier, Collector<? super T, A, D>)
  • join()
  • join(CharSequence)
  • join(CharSequence, CharSequence, CharSequence)
  • of(T)
  • of(T...)
  • empty()
  • iterate(T, UnaryOperator)
  • generate()
  • generate(T)
  • generate(Supplier)
  • seq(Stream)
  • seq(Iterable)
  • seq(Iterator)
  • seq(Map<K, V>)
  • seq(Optional)
  • cycle(Stream)
  • unzip(Stream<Tuple2<T1, T2>>)
  • unzip(Stream<Tuple2<T1, T2>>, Function<T1, U1>, Function<T2, U2>)
  • unzip(Stream<Tuple2<T1, T2>>, Function<Tuple2<T1, T2>, Tuple2<U1, U2>>)
  • unzip(Stream<Tuple2<T1, T2>>, BiFunction<T1, T2, Tuple2<U1, U2>>)
  • zip(Stream, Stream)
  • zip(Stream, Stream, BiFunction<T1, T2, R>)
  • zipWithIndex(Stream)
  • foldLeft(Stream, U, BiFunction<U, ? super T, U>)
  • foldRight(Stream, U, BiFunction<? super T, U, U>)
  • scanLeft(Stream, U, BiFunction<U, ? super T, U>)
  • scanRight(Stream, U, BiFunction<? super T, U, U>)
  • unfold(U, Function<U, Optional<Tuple2<T, U>>>)
  • reverse(Stream)
  • shuffle(Stream)
  • shuffle(Stream, Random)
  • concat(Stream...)
  • duplicate(Stream)
  • toString(Stream<?>)
  • toString(Stream<?>, String)
  • toCollection(Stream, Supplier)
  • toList(Stream)
  • toSet(Stream)
  • toMap(Stream<Tuple2<K, V>>)
  • toMap(Stream, Function<T, K>, Function<T, V>)
  • slice(Stream, long, long)
  • skip(Stream, long)
  • skipWhile(Stream, Predicate<? super T>)
  • skipUntil(Stream, Predicate<? super T>)
  • limit(Stream, long)
  • limitWhile(Stream, Predicate<? super T>)
  • limitUntil(Stream, Predicate<? super T>)
  • intersperse(Stream, T)
  • partition(Stream, Predicate<? super T>)
  • splitAt(Stream, long)
  • splitAtHead(Stream)
  • ofType(Stream, Class)
  • cast(Stream, Class)
  • groupBy(Stream, Function<? super T, ? extends K>)
  • groupBy(Stream, Function<? super T, ? extends K>, Collector<? super T, A, D>)
  • groupBy(Stream, Function<? super T, ? extends K>, Supplier, Collector<? super T, A, D>)
  • join(Stream<?>)
  • join(Stream<?>, CharSequence)
  • join(Stream<?>, CharSequence, CharSequence, CharSequence)
  • filter(Predicate<? super T>)
  • map(Function<? super T, ? extends R>)
  • mapToInt(ToIntFunction<? super T>)
  • mapToLong(ToLongFunction<? super T>)
  • mapToDouble(ToDoubleFunction<? super T>)
  • flatMap(Function<? super T, ? extends Stream<? extends R>>)
  • flatMapToInt(Function<? super T, ? extends IntStream>)
  • flatMapToLong(Function<? super T, ? extends LongStream>)
  • flatMapToDouble(Function<? super T, ? extends DoubleStream>)
  • distinct()
  • sorted()
  • sorted(Comparator<? super T>)
  • peek(Consumer<? super T>)
  • limit(long)
  • skip(long)
  • onClose(Runnable)
  • close()
  • sequential()
  • parallel()
  • unordered()
  • spliterator()
  • forEach(Consumer<? super T>)

#com.aol.cyclops.sequence.SequenceM

* flatten()
* Optional<List<T>> toOptional();
* CompletableFuture<List<T>> toCompletableFuture();
* cycle(int times)
* cycle()
* cycle(Monoid<T> m, int times) ;
* <R> SequenceM<R> cycle(Class<R> monadC, int times);
* SequenceM<T> cycleWhile(Predicate<? super T> predicate);
* SequenceM<T> cycleUntil(Predicate<? super T> predicate);
* <U> SequenceM<Tuple2<T, U>> zipStream(Stream<U> other);
* <S,U> SequenceM<Tuple3<T,S,U>> zip3(Stream<? extends S> second,Stream<? extends U> third);
*  <T2,T3,T4> SequenceM<Tuple4<T,T2,T3,T4>> zip4(Stream<T2> second,Stream<T3> third,Stream<T4> fourth);
* <S, R> SequenceM<R> zipSequence(SequenceM<? extends S> second,
* 			BiFunction<? super T, ? super S, ? extends R> zipper)
* <S, R> SequenceM<R> zipAnyM(AnyM<? extends S> second,
* 			BiFunction<? super T, ? super S, ? extends R> zipper) ;
*  <S, R> SequenceM<R> zipStream(BaseStream<? extends S,? extends BaseStream<? extends S,?>> second,
* 			BiFunction<? super T, ? super S, ? extends R> zipper);
* Tuple2<SequenceM<T>,SequenceM<T>> duplicateSequence();
* Tuple3<SequenceM<T>,SequenceM<T>,SequenceM<T>> triplicate();
* Tuple4<SequenceM<T>,SequenceM<T>,SequenceM<T>,SequenceM<T>> quadruplicate();
* Tuple2<Optional<T>,SequenceM<T>> splitSequenceAtHead();
* Tuple2<SequenceM<T>,SequenceM<T>> splitBy(Predicate<T> splitter);
* SequenceM<List<T>> sliding(int windowSize);
* SequenceM<List<T>> sliding(int windowSize,int increment);
* SequenceM<List<T>> grouped(int groupSize);
* SequenceM<T> scanLeft(Monoid<T> monoid);
* SequenceM<T> scanRight(Monoid<T> monoid);
* boolean xMatch(int num, Predicate<? super T> c);
* HeadAndTail<T> headAndTail();
*  Optional<HeadAndTail<T>> headAndTailOptional();
* <R> R mapReduce(Monoid<R> reducer);
* <R> R mapReduce(Function<? super T,? extends R> mapper, Monoid<R> reducer);
*  List collectStream(Stream<Collector> collectors);
* <R> List<R> collectIterable(Iterable<Collector> collectors);
* T reduce(Monoid<T> reducer);
*  List<T> reduce(Stream<Monoid<T>> reducers);
*  List<T> reduce(Iterable<Monoid<T>> reducers);
*  T foldLeft(Monoid<T> reducer);
* <T> T foldLeftMapToType(Monoid<T> reducer);
* T foldRight(Monoid<T> reducer);
* public <T> T foldRightMapToType(Monoid<T> reducer);
*  Streamable<T> toStreamable();
* <T> Stream<T> toStream();
*  startsWith(Iterable<T> iterable);
* startsWith(Iterator<T> iterator);
* AnyM<T> anyM();
* flatMapAnyM(Function<? super T,AnyM<? extends R>> fn);
* flatMapCollection(Function<? super T,Collection<? extends R>> fn);
*  flatMapStream(Function<? super T,BaseStream<? extends R,?>> fn);
* flatMapOptional(Function<? super T,Optional<? extends R>> fn) ;
* flatMapCompletableFuture(Function<? super T,CompletableFuture<? extends R>> fn);
* flatMapCharSequence(Function<? super T,CharSequence> fn);
* flatMapFile(Function<? super T,File> fn);
* flatMapURL(Function<? super T, URL> fn) ;
* flatMapBufferedReader(Function<? super T,BufferedReader> fn);
* Collection<T> toLazyCollection();
*  Collection<T> toConcurrentLazyCollection();
*  Streamable<T> toConcurrentLazyStreamable();
* SequenceM<T> appendStream(Stream<T> stream);
* SequenceM<T> prependStream(Stream<T> stream);
* SequenceM<T> append(T... values);
* SequenceM<T> prepend(T... values) ;
* SequenceM<T> insertAt(int pos, T... values);
* SequenceM<T> deleteBetween(int start,int end);
* SequenceM<T> insertStreamAt(int pos, Stream<T> stream);
* FutureOperations<T> futureOperations(Executor exec);
* boolean endsWith(Iterable<T> iterable);
* boolean endsWith(Stream<T> stream);
* SequenceM<T> skip(long time, final TimeUnit unit);
* SequenceM<T> limit(long time, final TimeUnit unit);
* SequenceM<T> skipLast(int num);
* SequenceM<T> limitLast(int num);
* HotStream<T> hotStream(Executor e);
* T firstValue();
* T single()
* Optional<T> elementAt(long index)
* Tuple2<T,SequenceM<T>> get(long index)
* SequenceM<Tuple2<T,Long>> elapsed()
* SequenceM<Tuple2<T,Long>> timestamp()
* <T> CyclopsSubscriber<T> subscriber()
* SequenceM<T> xPer(int x, long time, TimeUnit t);
* SequenceM<T> onePer(long time, TimeUnit t);
* SequenceM<T> fixedDelay(long l, TimeUnit unit);
* SequenceM<T> jitter(long maxJitterPeriodInNanos);
* SequenceM<T> debounce(long time, TimeUnit t);
* SequenceM<List<T>> batchBySizeAndTime(int size, long time, TimeUnit t);
* <C extends Collection<T>> SequenceM<C> batchBySizeAndTime(int size,long time, TimeUnit unit, Supplier<C> factory);
* SequenceM<List<T>> batchByTime(long time, TimeUnit t);
* <C extends Collection<T>> SequenceM<C> batchByTime(long time, TimeUnit unit, Supplier<C> factory);
* SequenceM<List<T>> batchBySize(int size);
* <C extends Collection<T>>SequenceM<C> batchBySize(int size, Supplier<C> supplier);
* SequenceM<Streamable<T>> windowBySizeAndTime(int maxSize, long maxTime, TimeUnit maxTimeUnit);
* SequenceM<Streamable<T>> windowWhile(Predicate<T> predicate);
* SequenceM<Streamable<T>> windowUntil(Predicate<T> predicate);
* SequenceM<Streamable<T>> windowStatefullyWhile(BiPredicate<Streamable<T>,T> predicate);
* SequenceM<Streamable<T>> windowByTime(long time, TimeUnit t);
* SequenceM<List<T>> batchUntil(Predicate<T> predicate);
* SequenceM<List<T>> batchWhile(Predicate<T> predicate);
* <C extends Collection<T>>  SequenceM<C> batchWhile(Predicate<T> predicate, Supplier<C> factory);
* <C extends Collection<T>>  SequenceM<C> batchUntil(Predicate<T> predicate, Supplier<C> factory);
* SequenceM<T> recover(final Function<Throwable, T> fn);
* <EX extends Throwable> SequenceM<T> recover(Class<EX> exceptionClass, final Function<EX, T> fn);
* <R> SequenceM<R> retry(Function<T,R> fn)

Additional operators (RxJava inspired)


zipping operators

  • combineLatest
  • withLatest

sharding operators :

  • shard (map, fn)

Control operators -

  • debounce
  • onePer
  • xPer
  • control (fn)
  • skipUntil (stream)
  • takeUntil (stream)
  • jitter
  • fixedDelay

Batching operators

  • batchBySize
  • batchByTime
  • batch (fn)

Chunking operators

  • chunkSinceLastRead
  • chunkSinceLastReadIterator

Futures operators

  • limitFutures

  • skipFutures

  • sliceFutures

  • duplicateFutures

  • partitionFutures

  • splitAtFutures

  • zipFutures

  • zipFuturesWithIndex

  • firstOf

batchBySizeAndTime : batches results until a time or size limit is reached

e.g. batch in 10's or whatever has returned within 5 seconds

               lazyReact.from(urls)
                        .map(this::load)
                        .batchBySizeAndTime(10,5,TimeUnit.SECONDS)
                        .toList();

switchOnNextValue : creates a new stream that takes the lasted value from a number of streams

        	LazyFutureStream<Integer> fast =  ... //  [1,2,3,4,5,6,7..]
        	LazyFutureStream<Integer> slow =  ... //  [100,200,300,400,500,600..]
	  
        	LazyFutureStream<Integer> merged = fast.switchOnNextValue(Stream.of(slow));  
        	//[1,2,3,4,5,6,7,8,100,9,10,11,12,13,14,15,16,200..] 

copy : copies a Stream the specified number of times

            LazyFutureStream.of(1,2,3,4,5,6)
				.map(i->i+2)
				.copy(5)
				.forEach(s -> System.out.println(s.toList()));

toLazyCollection : creates a Collection placeholder but doesn't block. EagerFutureStreams and SimpleReactStreams can populate the Collection asynchronously immediately and LazyFutureStreams won't populate it until a method is invoked

             Collection<Integer> col = LazyFutureStream.of(1,2,3,4,5,6)
				.map(i->i+2)
				.toLazyCollection();

toConcurrentLazyCollection : creates a lazy collection that can be shared across threads

           Collection<Integer> col = LazyFutureStream.of(1,2,3,4,5,6)
				.map(i->i+2)
				.toConcurrentLazyCollection(); 

firstValue : return the first value in a stream, must be present - no optional

           int first = LazyFutureStream.of(1,2,3,4)
                                        .firstValue();
	   
	    //first is 1

single : return a single entry, exception if no entries or multiple

          int num  =	LazyFutureStream.of(1)
                                        .single();
	  
	   //num is 1

futureOperations() & futureOperations(executor) - access terminal operations that return a future and execute asyncrhonously

          CompletableFuture<Integer>  sum = LazyFutureStream.of(1,2,3,4,5)
												.map(it -> it*100)
												.futureOperations()
												.reduce( 50,(acc,next) -> acc+next);

         //sum is CompletableFuture[1550]

sliding(size) : creates a sliding window over the data in the stream

          //futureStream 
Clone this wiki locally