dave08
10/06/2021, 1:35 PMval l = listOf(foo1, foo2, foo3)
var found = l.find(::criteria1)
if (found != null) return doAction(found)
var found = l.find(::criteria2)
if (found != null) return doAction2(found)
...
Tobias Suchalla
10/06/2021, 1:41 PMfun test(): T? {
fun criteria1(item: Int): Boolean = item == 3
fun criteria2(item: Int): Boolean = item == 1
val criterias = listOf(::criteria1, ::criteria2)
val list = listOf(1, 2, 3)
for (criteria in criterias) {
list.find(criteria)?.let { return doAction(it) }
}
return null
}
dave08
10/06/2021, 1:44 PMwbertan
10/06/2021, 1:53 PMfun asas(): Int {
fun criteria1(item: Int): Boolean = item == 3
fun criteria2(item: Int): Boolean = item == 1
fun doAction(item: Int): Int = item
fun doAction2(item: Int): Int = item
val list = listOf(1, 2, 3)
val actionsForCriteria: Map<(Int) -> Boolean, (Int) -> Int> = mapOf(
::criteria1 to ::doAction,
::criteria2 to ::doAction2,
)
return actionsForCriteria.firstNotNullOfOrNull { (criteria, action) ->
list.firstOrNull(criteria)?.let(action)
} ?: error("Not found!")
}
Tobias Suchalla
10/06/2021, 1:55 PMtypealias Criteria = (Int) -> Boolean
typealias SubCriteria = (Int) -> Boolean
typealias Action = (Int) -> String
fun test(): String? {
val criteriaMap: Map<Criteria, Map<SubCriteria, Action>> = mapOf(
{ item: Int -> item == 3 } to mapOf(
{ item: Int -> item % 2 == 0 } to { item: Int -> item.toString() }
)
)
val list = listOf(1, 2, 3)
for ((criteria, subCriteriaMap) in criteriaMap) {
list.find(criteria)?.let { found ->
for ((subCriteria, action) in subCriteriaMap) {
if (subCriteria(found)) {
return action(found)
}
}
}
}
return null
}
But it does get rather big...dave08
10/06/2021, 2:00 PMl.find(::criteria1)?.let { return doAction1(it) }
l.find(::criterai2)?.let { return if (it.subcriteria()) doAction2_1(it) else doAction2_2(it) }