У меня есть API, у которого есть метод, который принимает vararg некоторого объекта (например, Param). Мне нужно отфильтровать нулевые параметры, а не помещать их в vararg. Является ли это возможным ?
Я знаю, что в котлине есть метод listOfNotNull, но API принимает vararg(
Это пример вызова метода API (apiMethod(vararg params: Param)):
someFun() {
apiMethod(
Param("first"),
Param("second"),
null // need to filter it
)
}
P.S. Я не могу измениться apiMethod()
Отвечает ли это на ваш вопрос? Kotlin конвертирует List в vararg





Ваш apiMethod() должен потерпеть неудачу либо отфильтровать нули, либо просто потерпеть неудачу, если предоставлен список, содержащий нуль
fun apiMethod(a : Int, b : String, vararg params : List<Any?>){
require(params.size == params.mapNotNull { it }.size) {
"Params must not contain null values"
}
// or
val filtered = params.mapNotNull { it }
}
Разве filterNotNull() не будет проще, чем mapNotNull{ it }? (Примечание: …Not…, а не …Non….)
Конечный результат тот же. (ошибся насчет не и не)
Тот же результат, но менее читаемый код.
Попробуйте метод mapNotNull
val notNullArgs = args.mapNotNull { it }
Если будет нуль it он будет отфильтрован
Если я правильно понимаю ваш вопрос, вам нужно отфильтровать свои аргументы, прежде чем передавать их функции, поскольку вы не можете изменить функцию. Для этого вы можете отфильтровать список, а затем преобразовать этот список в типизированный массив и передать его с помощью оператора распространения *:
fun someFun() {
apiMethod(
*listOfNotNull(
Param("first"),
Param("second"),
null // need to filter it
).toTypedArray()
)
}
Жаль, что вы должны использовать toTypedArray(). IMO, он должен поддерживаться для всех итерируемых объектов, поскольку списки гораздо более распространены, чем массивы. Этот запрос функции не привлек особого внимания со стороны JetBrains.
Вы можете передать
Listвараргам. См. stackoverflow.com/q/51161558/5133585