Котлин: извлечение из списка - PullRequest
0 голосов
/ 10 октября 2019

У меня есть список элементов Int, скажем. Теперь я хочу вызвать процесс-функцию (item1, item2, item3, item4)

Как это сделать в kotlin. Я хочу передать методу, сколько когда-либо элементов в списке. Метод принимает переменное число аргументов

Я хочу вызвать этот метод из библиотеки firbase mlk

public FirebaseVisionBarcodeDetectorOptions.Builder 

    setBarcodeFormats(@BarcodeFormat int var1, @BarcodeFormat int... var2) {
    }

Поэтому мне нужно вызвать setBarcodeFormats (есть ли способ в kotlin для передачи каждого элементасписок как аргумент здесь)

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Исходя из описания вашей проблемы, я предполагаю, что у вас есть один метод, который принимает переменное число целых чисел - назовем его fun foo(vararg n: Int).

Если это так, то генерируемый байт-код являетсяследующее:

public final static varargs foo([I)V

Это означает, что метод принимает массив int, который является IntArray в мире Kotlin.

Для вызова этого метода с IntArrayвам нужно сделать:

fun foo(vararg n: Int) {
    n.forEach(::println) // do something with n
}

fun main() {
    val numbers = intArrayOf(1, 2, 3, 4)
    foo(*numbers) // prints 1; 2; 3; 4
}

В этом фрагменте кода * является оператором распространения и кратко описан здесь .

Также обратите внимание, что оператор распространения может применяться только к массивам, поэтому если у вас есть список Int, вам нужно сначала преобразовать его в IntArray, а затем применить оператор распространения, например:

fun foo(vararg n: Int) {
    n.forEach(::println) // do something with n
}

fun main() {
    val numbers = listOf(1, 2, 3, 4)
    foo(*numbers.toIntArray()) // prints 1; 2; 3; 4
}

РЕДАКТИРОВАТЬ

После обновления вашего вопроса вы можете вызвать этот метод из своего кода Kotlin следующим образом:

val builder = ... // obtain a Builder instance
val args = intArrayOf(1, 2, 4, 10)
builder.setBarcodeFormats(1, *args) // or any other meaningful value
1 голос
/ 10 октября 2019

У вас есть два пути. Сначала передайте List из Int в метод. второй использует varargs. Например, функция, которая принимает n чисел в качестве входных данных и возвращает среднее значение всех входных данных. Если мы хотим использовать List, это будет выглядеть так:

fun getAverage(numbersList: List<Int>): Float {

    var sum = 0.0f
    for (item in numbersList) {
        sum += item
    }
    return (sum / numbersList.size)
}
val arrayList = arrayListOf(1, 2, 3, 4)
val result = getAverage(arrayList)

И если мы хотим передать числа как бесконечные параметры функции, мы могли бы сделать это с varargs следующим образом:

fun getAverage(vararg input: Int): Float {
    var sum = 0.0f
    for (item in input) {
        sum += item
    }
    return (sum / input.size)
}
val result1 = getAverage(1, 2, 3)
val result2 = getAverage(1, 2, 3, 4, 5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...