KTee is Tee for Kotlin code pipelines. If you love the unix command line tee
, you know what we mean.
Often times we need to break a perfect computation pipeline just to be able to log the intermediate values. For example, lets take a look at this code:
(1..10)
.filter { it % 2 == 0 }
.map { it * 2 }
.reduce(Int::plus)
If we want to print the result of filter
or map
we need to either capture the result into an intermediate val
or add a .let { }
with logging statements.
KTee simplifies printing intermediate values dramatically.
Just .tee()
it. Seriously! Try this:
(1..10)
.filter { it % 2 == 0 }.tee()
.map { it * 2 }.tee()
.reduce(Int::plus).tee()
Which produces following output on the console:
[2, 4, 6, 8, 10]
[4, 8, 12, 16, 20]
60
We can customize the way tee
prints using markers and lambda blocks to return custom log messages.
(1..10)
.filter { it % 2 == 0 }.tee("even numbers: ")
.map { it * 2 }.tee("doubles >>>>> ")
.reduce(Int::plus).tee {"the result is $it"}
Produces:
even numbers: [2, 4, 6, 8, 10]
doubles >>>>> [4, 8, 12, 16, 20]
the result is 60
We can also log to a custom logger instance (slf4j) instead of stdout
(1..10)
.filter { it % 2 == 0 }.teeToDebug(logger)
.map { it * 2 }.teeToTrace(logger)
.reduce(Int::plus).teeToInfo(logger) { "the result is $it" }
Produces:
[main] DEBUG ktee.KTeeTest - [2, 4, 6, 8, 10]
[main] TRACE ktee.KTeeTest - [4, 8, 12, 16, 20]
[main] INFO ktee.KTeeTest - the result is 60
This output was produced using
slf4j-simple
binding. Your output pattern may look different depending on logger's configuration
ktee
is available in Maven Central 🎉
repositories {
mavenCentral()
}
dependencies {
implementation 'com.medly:ktee:1.0.0'
}