Java получить хорошую ссылку toString для объекта на некоторый тип массива - PullRequest
2 голосов
/ 14 января 2020

Если у меня есть ссылка на тип Object, и я знаю, что это массив, но я не знаю, какой это массив, каков наилучший способ создания хорошей строки?

Или в Другими словами, что является лучшей / лучшей реализацией для следующего метода:

private static String anyArrayToString(Object someArray) {
    if (!someArray.getClass().isArray()) {
        throw new IllegalArgumentException("someArray is not an array!");
    }
    return ???;
}

Мне известны методы из Arrays, а именно Arrays.toString (int []), Arrays.toString (double [] ) и др. c. Они не работают здесь, потому что они строго типизированы, и я не чувствую, что у меня есть большой каскад if-else-if. (хотя это мой план Б, если лучшего решения найти не удастся)

В идеале мне нужен метод, который работает с объектными ссылками, например System.arraycopy, который динамически проверяет, является ли переданная ссылка массивом или нет.

почему я не знаю, что это за массив?

Поскольку я получаю ссылку на объект через отражение после итерации всех методов get другого объекта. Это часть вспомогательного метода, который находит произвольные различия между двумя сложными объектами, даже если эти различия глубоко вложены.

Большое спасибо.

Редактировать:

Это НЕ дубликат Какой самый простой способ напечатать массив Java? , потому что здесь тип элемента массива неизвестен, и у нас есть только ссылка на Object, а не некоторые c тип массива.

1 Ответ

1 голос
/ 20 января 2020

Самый простой и краткий способ сделать это - использовать Java8 Stream API и методы из Array служебного класса.

Stati c method Array.getLength принимает ссылку типа Object. Если эта ссылка указывает на массив, возвращается длина этого массива. В противном случае выдается исключение. Tne stati c метод Array.get работает соответственно для предоставления доступа к отдельным элементам массива.

private static String anyArrayToString(Object someArray) {
    if (!someArray.getClass().isArray()) {
        throw new IllegalArgumentException("someArray is not an array!");
    }
    return "[" + IntStream.range(0, Array.getLength(someArray))
                     .mapToObj(i -> Objects.toString(Array.get(someArray, i)))
                     .reduce("", (l, r) -> l+", "+r)
               + "]";
}
...