Просто будь проще.
myList.forEach { it.someMethod() }
// or
myList.forEach(Item::someMethod)
Функция расширения также возможна, но, возможно, это уже слишком (по крайней мере, сузьте ее до вашего типа):
fun List<Item>.someMethod() = forEach { it.someMethod() }
Или, если вы хотите сделать доступ к этому методу зависимым от конкретного получателя, вы также можете объявить функцию расширения в этом конкретном типе. Таким образом, дан тип MyObj
с функцией расширения следующим образом:
class MyObj {
val funnyItems = mutableListOf<Item>()
val usefulItems = mutableListOf<Item>()
val whateverItems = mutableListOf<Item>()
fun List<Item>.someMethod() = forEach { it.someMethod() }
}
он будет вызываться только при наличии соответствующего приемника на месте. Поэтому добавление функции внутри класса MyObj
следующим образом работает:
fun callingSomeMethod() = funnyItems.someMethod() // no problem
, но не будет работать за пределами MyObj
. Например. рассмотрим main
-метод, не входящий в MyObj
:
fun main(args: Array<String>) {
listOf(MyObj())
.forEach {
// the following will not work... it is not accessible without appropriate receiver
// it.funnyItems.someMethod() // doesn't compile...
with(it) {
// 'this' is now MyObj which is the required receiver in addition to List<Item>, so the following works:
this.funnyItems.someMethod()
}
}
}