Как оценить эту функцию Kotlin для преобразования ArrayList из Any?ArrayList двойного - PullRequest
0 голосов
/ 12 марта 2019

Я сделал эту функцию для преобразования списка массивов Any? к списку массивов Double или к нулю. Я что-то упустил?

    fun toArrayListDoubleOrNull(arg: ArrayList<Any?>): ArrayList<Double>? {
        if (arg.isNullOrEmpty() || arg.contains(null)) {
            return null;
        }
        arg.forEach { i: Any? ->
            if (i.toString().trim().toDoubleOrNull() == null) {
                return null;
            }
        };
        val ret = ArrayList<Double>();
        arg.forEach { i: Any? -> ret.add(i.toString().trim().toDouble()); };
        return ret;
    }

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Я считаю, что ваш исходный вариант использования может быть решен лучше, поэтому, возможно, вы захотите рассказать, зачем эта функция нужна в первую очередь. Пока это не произойдет, вы можете сделать что-то вроде этого:

fun List<Any?>.toDoubles(): List<Double>? =
    takeIf { isNotEmpty() && none { e -> e == null || e !is Double } }?.map { it as Double }

В действии:

val allDouble = listOf<Any>(1.0, 2.0, 3.0)
val stuff = listOf("", 1, 2.0, 3.0)
val doublesAndNull = listOf<Any?>(1.0, null, 2.0)
println(allDouble.toDoubles()) //[1.0, 2.0, 3.0]
println(stuff.toDoubles()) //null
println(doublesAndNull.toDoubles()) //null
0 голосов
/ 12 марта 2019

Исходя из ваших требований, это более «идиоматический» подход:

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()
...