Путем преобразования всех вложенных элементов в плоский Sequence
их можно итеративно выполнять итерациями, а ненужные итерации исключаются.Этот трюк делается путем объединения asSequence
и flatMap
:
listOfA.asSequence().flatMap { it.objectBs.asSequence() }.find { it.key == wantedKey }
Я написал и запустил следующий код, чтобы убедиться, что он работает должным образом:
class PrintSequenceDelegate<out T>(private val wrappedSequence: Sequence<T>) : Sequence<T> by wrappedSequence {
override fun iterator(): Iterator<T> {
val wrappedIterator = wrappedSequence.iterator()
return object : Iterator<T> by wrappedIterator {
override fun next(): T =
wrappedIterator.next().also { println("Retrieving: $it") }
}
}
}
fun <T> Sequence<T>.toPrintDelegate() = PrintSequenceDelegate(this)
fun main() {
val listOfLists = List(3) { i -> List(3) { j -> "$i$j" } }
println("List of lists: $listOfLists")
val found = listOfLists.asSequence().toPrintDelegate().flatMap { it.asSequence().toPrintDelegate() }.find { it == "11" }
println(if (found != null) "Found: $found" else "Not found")
}
Вывод:
List of lists: [[00, 01, 02], [10, 11, 12], [20, 21, 22]]
Retrieving: [00, 01, 02]
Retrieving: 00
Retrieving: 01
Retrieving: 02
Retrieving: [10, 11, 12]
Retrieving: 10
Retrieving: 11
Found: 11
Таким образом, мы видим, что элементы (12
) после элемента, найденного в содержащем вложенном списке, не повторяются, равно как и следующие вложенные списки ([20, 21, 22]
).