snowe
10/05/2020, 11:09 PMfor (Map<String, String> serviceOutputs; (serviceOutputs = resultReader.read(header)) != null; ) {
try {
final double elapsed = Double.parseDouble(serviceOutputs.get("__elapsed"));
gets converted to
var serviceOutputs: Map<String, String>
while (resultReader.read(*header).also { serviceOutputs = it } != null) {
try {
val elapsed = it["__elapsed"]!!.toDouble()
which doesn’t work because it
can be null, and serviceOutputs
can’t be null.
I can correct this to:
var serviceOutputs: Map<String, String>?
while (resultReader.read(*header).also { serviceOutputs = it } != null) {
serviceOutputs?.let {
try {
val elapsed = it["__elapsed"]!!.toDouble()
but that is pretty messy and not indicative at all of what is happening. serviceOutputs
can never be null in the block, and using a let
is messy. Any way to accomplish this a bit cleaner?Nir
10/05/2020, 11:17 PMNir
10/05/2020, 11:17 PMNir
10/05/2020, 11:18 PMsnowe
10/05/2020, 11:19 PMsnowe
10/05/2020, 11:20 PMit
and see what I get.Nir
10/05/2020, 11:20 PMnanodeath
10/05/2020, 11:21 PMwhile (true) {
val serviceOutputs = resultReader.read(header) ?: break
val elapsed = serviceOutputs["__elapsed"]?.toDouble() ?: error("No __elapsed field")
Nir
10/05/2020, 11:21 PMsnowe
10/05/2020, 11:21 PMNir
10/05/2020, 11:21 PMnanodeath
10/05/2020, 11:21 PMwhile (true)
kinda surprisingly oftenNir
10/05/2020, 11:21 PMNir
10/05/2020, 11:22 PMNir
10/05/2020, 11:22 PMNir
10/05/2020, 11:22 PMnanodeath
10/05/2020, 11:22 PMresultReader.readToSequence(header).forEach {
snowe
10/05/2020, 11:22 PMNir
10/05/2020, 11:23 PMNir
10/05/2020, 11:24 PMgenerateSequence { resultReader.read(*header) }.forEach { ... }
Nir
10/05/2020, 11:25 PMfor (x in generateSequence { resultReader.read(*header) } ) { ... }
Nir
10/05/2020, 11:25 PMsnowe
10/05/2020, 11:26 PMNir
10/05/2020, 11:33 PMNir
10/05/2020, 11:33 PMsnowe
10/05/2020, 11:34 PMNir
10/05/2020, 11:35 PMsequence
is basically a coroutine, in a sense 🙂 Sure, np!