Имеет ли смысл повторно использовать один и тот же массив вместо объявления нового? - PullRequest
0 голосов
/ 06 июня 2018

Имеет ли смысл повторно использовать этот же массив вместо объявления в .collectInto?

return loadSortedSparseNumbersObservable()
    .collectInto(
            new numbers[1000],
            (array, number) -> {
                int index = computeTrueIndex(...);
                array[index] = number;
            }
    )
    .map(array -> );

Возможно, приведенный выше код можно заменить на что-то вроде:

long[] array = new long[700];
return loadSortedSparseNumbersObservable()
        .doOnNext(
                Arrays.fill(array, 0L),
                (array, number) -> {
                    int index = computeTrueIndex(...);
                    array[index] = number;
                }
        )
        .toCompletable()
        .andThen(Single.just(array))
        .map(array -> );

Iхотя не очень люблю мутирующий объект.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Ваш второй пример имеет больше операторов, поэтому потенциально больше накладных расходов и, конечно, труднее читать и понимать.

Большой недостаток в обоих ваших примерах заключается в том, что возвращенный Observable не может быть повторно использован безопасно.Параллельные вызовы к тому же Observable будут взаимодействовать с массивом.Безопасный способ сделать это - создать новый массив для каждой подписки.Используйте collect вместо collectInto:

return loadSortedSparseNumbersObservable()
    .collect(
            () -> new numbers[1000],
            (array, number) -> {
                int index = computeTrueIndex(...);
                array[index] = number;
            }
    )
    .map(array -> );
0 голосов
/ 06 июня 2018

Проблема изменения массива на месте - это безопасность потоков.Массивы в Java передаются по ссылке, поэтому любое повторное использование / изменение массива может вызвать проблемы параллелизма в других частях программы.

Однако этот вопрос не дает представления о структуре или функции кода, использующего этот конкретный массив, поэтому может существовать конкретная прикладная причина для изменения на месте.Точно так же может быть очень веская причина не делать этого.

...