Chcę napisać funkcję, która zwraca każdy element w List
że nie jest to pierwsza lub ostatnia pozycja (punkt przelotowy). Funkcja otrzymuje ogólne wejście List<*>
. Wynik powinien być zwrócony tylko wtedy, gdy elementy listy są typu Waypoint
:Kotlin: Jak pracować z listy rzuca: niezaznaczone Występują: kotlin.collections.List <Kotlin.Any?> do kotlin.colletions.List <Waypoint>
fun getViaPoints(list: List<*>): List<Waypoint>? {
list.forEach { if(it !is Waypoint) return null }
val waypointList = list as? List<Waypoint> ?: return null
return waypointList.filter{ waypointList.indexOf(it) != 0 && waypointList.indexOf(it) != waypointList.lastIndex}
}
Podczas odlewania List<*>
do List<Waypoint>
, pojawia się ostrzeżenie:
niezaznaczone Obsada: kotlin.collections. Listę do kotlin.colletions.List
Nie mogę wymyślić sposób realizacji go inaczej. Jaki jest właściwy sposób wdrożenia tej funkcji bez tego ostrzeżenia?
Świetna odpowiedź! Wybieram rozwiązanie list.filterIsInstance(), ponieważ uważam, że jest to najczystsze rozwiązanie. –
lukle
Należy zauważyć, że jeśli używasz ['filterIsInstance'] (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/filter-is-instance.html), a oryginalna lista zawiera elementy innego typu Twój kod będzie je cicho odfiltrowywać. Czasem to jest to, czego chcesz, ale czasami wolisz mieć wyjątek "IllegalStateException" lub podobny. Jeśli jest to późniejsze, możesz utworzyć własną metodę sprawdzania, a następnie rzutowania: 'inline fun Iterable <*> .mapAsInstance() = map {it.apply {check (to jest R)} jako R}' –
mfulton26
Pamiętaj, że '.apply' nie zwraca zwracanej wartości lambda, zwraca obiekt receive. Prawdopodobnie chcesz użyć '.takeIf', jeśli chcesz, aby opcja zwróciła wartość null. – bj0