我希望Stack
像Eclipse调试器一样打印一个对象(即[1,2,3...]
),但打印它out = "output:" + stack
不会返回这个好结果.
为了澄清,我在谈论Java的内置集合,所以我无法覆盖它toString()
.
如何获得堆栈的可打印版本?
您可以将其转换为数组,然后将其打印出来Arrays.toString(Object[])
:
System.out.println(Arrays.toString(stack.toArray()));
String.join(",", yourIterable);
(Java 8)
Apache Commons项目提供的MapUtils类提供了MapUtils.debugPrint
一种可以打印地图的方法.
使用java 8流和收集器,它可以轻松完成:
String format(Collection> c) { String s = c.stream().map(Object::toString).collect(Collectors.joining(",")); return String.format("[%s]", s); }
首先我们使用map
with Object::toString
来创建Collection
然后使用join collector来加入集合中的每个项目,
作为分隔符.
在类上实现toString().
我建议使用Apache Commons ToStringBuilder来简化这一过程.有了它,你只需要编写这种方法:
public String toString() { return new ToStringBuilder(this). append("name", name). append("age", age). toString(); }
为了获得这种输出:
人@ 7f54 [名称=斯蒂芬,年龄= 29]
还有一个反思性的实施.
System.out.println(Collection c)已经以可读格式打印任何类型的集合.仅当集合包含用户定义的对象时,您才需要在用户定义的类中实现toString()以显示内容.
番石榴看起来是个不错的选择:
Iterables.toString(myIterable)
我同意上述有关覆盖toString()
您自己的类的评论(以及尽可能自动化该过程).
对于您没有定义的ToStringHelper
类,您可以为每个要根据自己的喜好处理的库类编写一个带有重载方法的类:
public class ToStringHelper { //... instance configuration here (e.g. punctuation, etc.) public toString(List m) { // presentation of List content to your liking } public toString(Map m) { // presentation of Map content to your liking } public toString(Set m) { // presentation of Set content to your liking } //... etc. }
编辑:回应xukxpvfzflbbld的评论,这里是前面提到的案例的可能实现.
package com.so.demos; import java.util.List; import java.util.Map; import java.util.Set; public class ToStringHelper { private String separator; private String arrow; public ToStringHelper(String separator, String arrow) { this.separator = separator; this.arrow = arrow; } public String toString(List> l) { StringBuilder sb = new StringBuilder("("); String sep = ""; for (Object object : l) { sb.append(sep).append(object.toString()); sep = separator; } return sb.append(")").toString(); } public String toString(Map,?> m) { StringBuilder sb = new StringBuilder("["); String sep = ""; for (Object object : m.keySet()) { sb.append(sep) .append(object.toString()) .append(arrow) .append(m.get(object).toString()); sep = separator; } return sb.append("]").toString(); } public String toString(Set> s) { StringBuilder sb = new StringBuilder("{"); String sep = ""; for (Object object : s) { sb.append(sep).append(object.toString()); sep = separator; } return sb.append("}").toString(); } }
这不是一个全面的实现,而只是一个启动器.
您可以使用JAVA中的"Objects"类(自1.7起可用)
CollectionmyCollection = Arrays.asList("1273","123","876","897"); Objects.toString(myCollection);
产出:1273,123,876,897
另一种可能性是使用Google Guave中的"MoreObjects"类,它提供了许多有用的辅助函数:
MoreObjects.toStringHelper(this).add("NameOfYourObject", myCollection).toString());
输出:NameOfYourObject = [1273,123,876,897]
番石榴文件