如果我有一个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而不是某些特定的数组类型。
最干净,最简洁的方法是使用Java8 Stream API和Array实用工具类中的方法。
静态方法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)
+ "]";
}