Java获得不错的toString,以便对象引用某种数组类型

问题描述 投票:1回答:1

如果我有一个Object类型的引用,并且我知道这是一个数组,但是我不知道哪种数组,生成一个好的String的最佳方法是什么?

换句话说,以下方法的最佳/最佳实现是什么:

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 [])等。这些方法在这里不起作用,因为它们是强类型的,我不希望拥有一个很大的if-else-if级联。 (尽管找不到更好的解决方案,这是我的计划B)

理想情况下,我想要一个对对象引用(例如System.arraycopy)起作用的方法,该方法可以动态检查传递的引用是否为数组。

为什么不知道它是哪种数组?

因为我遍历了不同对象的所有get方法后,通过反射获得了对象引用。它是实用程序方法的一部分,该实用程序可以找到两个复杂对象之间的任意差异,即使这些差异嵌套得很深。

非常感谢。

编辑:

这不是What's the simplest way to print a Java array?的副本,因为在这里数组的元素类型是未知的,并且我们仅引用Object而不是某些特定的数组类型。

java reflection tostring
1个回答
0
投票

最干净,最简洁的方法是使用Java8 Stream APIArray实用工具类中的方法。

静态方法Array.getLength采用对象类型的引用。如果该引用指向一个数组,则返回该数组的长度。否则将引发异常。静态方法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)
               + "]";
}
© www.soinside.com 2019 - 2024. All rights reserved.