Minimalistic, extensible, non-parallel and lazy sequence implementation interoperable with Java
Stream (toStream and fromStream), which provides an idiomatic yield like generator.
JAYield Query provides similar operations to Java Stream, or
jOOλ Seq, or StreamEx, or Vavr Stream.
Yet, Query is extensible and its methods can be chained
fluently with new operations in a pipeline.
Furthermore, Query has lower per-element access cost and offers an optimized
fast-path traversal, which presents better sequential processing performance in
some benchmarks, such as sequences-benchmarks and jayield-jmh.
The core API of Query provides well-known query methods that can be
composed fluently (pipeline), e.g.:
// pipeline: iterate-filter-map-limit-forEach
//
Query.iterate('a', prev -> (char) ++prev).filter(n -> n%2 != 0).map(Object::toString).limit(10).forEach(out::println);Notice how it looks a JAYield custom collapse() method that merges series of adjacent elements.
It has a similar shape to that one written in any language providing the yield feature
such as Kotlin.
class Queries {
private U prev = null;
<U> Traverser<U> collapse(Query<U> src) {
return yield -> {
src.traverse(item -> {
if (prev == null || !prev.equals(item))
yield.ret(prev = item);
});
};
}
} |
fun <T> Sequence<T>.collapse() = sequence {
var prev: T? = null
val src = this@collapse.iterator()
while (src.hasNext()) {
val aux = src.next()
if (aux != null && aux != prev) {
prev = aux
yield(aux)
}
}
} |
These methods can be chained in queries, such as:
Query
.of(7, 7, 8, 9, 9, 8, 11, 11, 9, 7)
.then(new Queries()::collapse)
.filter(n -> n%2 != 0)
.map(Object::toString)
.traverse(out::println); |
sequenceOf(7, 7, 8, 9, 9, 8, 11, 11, 9, 7)
.collapse()
.filter { it % 2 != 0 }
.map(Int::toString)
.forEach(::println) |
Traverser is the primary choice for traversing the Query elements in bulk and
supports all its methods including terminal, intermediate and short-circuting
operations.
To that end, the traversal's consumer - Yield - provides one method to return
an element (ret) and other to finish the iteration (bye).
Advancer is the alternative iterator of Query that provides individually traversal.
In order to include it to your Maven project, simply add this dependency:
<dependency>
<groupId>com.tinyield</groupId>
<artifactId>jayield</artifactId>
<version>1.5.1</version>
</dependency>You can also download the artifact directly from Maven Central Repository
This project is licensed under Apache License, version 2.0