Исходя из ваших требований, это более «идиоматический» подход:
fun toArrayListDoubleOrNull(input: ArrayList<Any?>): List<Double>? {
val result = input
.filter { it is Double }
.map { it as Double }
return if(result.size == input.size) {
result
} else {
null
}
}
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ теперь он возвращает список вместо ArrayList
Чтобы проверить это, я написал следующие тесты:
class ArrayListToDouble {
@Test
fun `toArrayListDoubleOrNull with null values`() {
val input: ArrayList<Any?> = arrayListOf(12.0, 13.0, null)
val doubleArrayList = stackoverflow.toArrayListDoubleOrNull(input)
assertTrue(doubleArrayList == null)
}
@Test
fun `toArrayListDoubleOrNull without null values`() {
val input: ArrayList<Any?> = arrayListOf(12.0, 13.0)
val output: List<Double> = stackoverflow.toArrayListDoubleOrNull(input)!!
assertTrue(output == arrayListOf(12.0, 13.0))
}
}
Чуть более идиоматично было бы использовать функцию расширения:
fun List<Any?>.toDoubleListOrNull(): List<Double>? {
val result = this
.filter { it is Double }
.map { it as Double }
return if(result.size == this.size) {
result
} else {
null
}
}
Вы можете назвать это так:
val input = arrayListOf(12.0, 15.2)
val output = input.toDoubleListOrNull()