Почему Rx печатает весь массив, а не каждый элемент - PullRequest
1 голос
/ 15 марта 2019

У меня есть следующий код:

 val places: Array<String> = arrayOf("Singapore", "Japan", "Norway") // From an Array - Output will be elements of the array
        val observable = Observable.fromArray(places)


        var result = "Hello, "

        observable.subscribe(
            { item ->
                result += item
            },
            { error ->
                error.printStackTrace()
            },
            {
                println("Done")
            }
        )

        print(result)
    }

Я ожидаю, что это напечатает Привет, Сингапур | Привет, Япония | Здравствуйте, Норвегия

Однако я получаю:

Hello, [[Ljava.lang.String;@3830f1c0]

Чего мне не хватает для печати элементов из массива

1 Ответ

3 голосов
/ 15 марта 2019

Observable.fromArray немного отличается, скажем, от fromIterable. Он не принимает фактический массив, но вместо этого он принимает аргументы vararg. Вот его подпись:

public static <T> Observable<T> fromArray(T... items)

То есть, если его так назвать, вы получите Observable, содержащий один элемент, и он будет иметь тип Observable<Array<String>>:

val places: Array<String> = arrayOf("Singapore", "Japan", "Norway")
val observable: Observable<Array<String>> = Observable.fromArray(places)

То, что вы ищете, Observable<String>, может быть создано так:

val observable: Observable<String> = Observable.fromArray("Singapore", "Japan", "Norway")

Или, если у вас есть существующий массив, используйте оператор распространения :

val places: Array<String> = arrayOf("Singapore", "Japan", "Norway")
val observable: Observable<String> = Observable.fromArray(*places)
...