这我不清楚你所期望的输出是否真的是你想要的,或者它只是你当前代码的一个工件(即结合第三方库方法ArrayUtils.toString(o)
的输出与List.toString
)。
当您只需使用Arrays.deepToString
你已经得到
"[aaa, zzz, [3, 4], [1, 2], [3, 4], null]"
如果你真的想使用Stream
API作为一个练习,或者要加强对格式实际控制,你可以这样来做:
使用java.lang.reflect.Array
public class MyArrayUtil {
static String paramsAsString(Object o) {
if(o==null) return "null";
if(!o.getClass().isArray()) return o.toString();
return IntStream.range(0, Array.getLength(o))
.mapToObj(i->Array.get(o, i)).map(MyArrayUtil::paramsAsString)
.collect(Collectors.joining(", ", "{", "}"));
}
}
这确实不隐藏任何实用程序方法的用法,但可以自行格式化任何数组。并且它不会创建中间List
以使用其toString()
方法。相反,它使用适当的Collector
,它允许您控制输出。在上面的例子中,我使用{
,}
这样的结果将是:
{aaa, zzz, {3, 4}, {1, 2}, {3, 4}, null}
如果你想要更高的性能可能会牺牲可读性和使用下面的派生代码:
static String paramsAsString(Object o) {
if(o==null) return "null";
if(!o.getClass().isArray()) return o.toString();
Stream<String> stream;
if (o instanceof Object[]) {
stream=Arrays.stream((Object[]) o).map(MyArrayUtil::paramsAsString);
}
else if (o instanceof int[]) {
stream=Arrays.stream((int[])o).mapToObj(String::valueOf);
}
else if (o instanceof long[]) {
stream=Arrays.stream((long[])o).mapToObj(String::valueOf);
}
else if (o instanceof double[]) {
stream=Arrays.stream((double[])o).mapToObj(String::valueOf);
}
else stream=IntStream.range(0, Array.getLength(o))
.mapToObj(i->Array.get(o, i)).map(Object::toString);
return stream.collect(Collectors.joining(", ", "{", "}"));
}
我想不出除了将'map'的参数提取到实用程序方法之外,并且使用此方法的句柄代替。 – Marco13 2014-09-26 08:21:01
您是否知道['Arrays.deepToString'](http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#deepToString(java.lang.Object []))?它确实代码是关于你的代码的,它不会在'[]'和'{}'括号之间切换... – Holger 2014-09-26 08:27:53
你可以做的一件事就是替换'.collect(Collectors.toList())。toString() ;'用'.collect(收藏家。加入(“,”,“[”,“]”));'以避免不必要的中间'List'创建。 – Holger 2014-09-26 08:35:15