我经常需要打印列表或 map ,但我不喜欢它们默认的 toString()
方法的输出。例如 HashMap#toString()
输出如下所示:
{key-1=value-1, key-2=value-2, key-3=value-3}
但我希望输出是这样的:
key-1 = value-1, key-2 = value-2, key-3 = value-3
我创建了一个扩展 HashMap
的自定义类,并编写了自己的 toString()
方法,这导致了我真正的问题:
public final class CustomMap<K, V> extends HashMap<K, V> {
private static final long serialVersionUID = 1493227382148892732L;
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
final Iterator<Map.Entry<K, V>> entryIterator = entrySet().iterator();
if (entryIterator.hasNext()) {
final Map.Entry<K, V> entry = entryIterator.next();
builder.append(entry.getKey());
builder.append(" = ");
builder.append(entry.getValue());
}
while (entryIterator.hasNext()) {
final Map.Entry<K, V> entry = entryIterator.next();
builder.append(", ");
builder.append(entry.getKey());
builder.append(" = ");
builder.append(entry.getValue());
}
return builder.toString();
}
}
如您所见,我有重复的代码,因为 ,
部分必须省略一次。那么我怎样才能将其重写为一种快速有效的方法而无需重复代码呢?
最佳答案
这可以通过 boolean 值轻松解决:
final Iterator<Map.Entry<K, V>> entryIterator = entrySet().iterator();
boolean first = true;
while (entryIterator.hasNext()) {
final Map.Entry<K, V> entry = entryIterator.next();
if (!first)
builder.append(", ");
else
first=false;
builder.append(entry.getKey());
builder.append(" = ");
builder.append(entry.getValue());
}
另一种选择是使用 Java 8 StringJoiner :
StringJoiner sj = new StringJoiner(",");
while (entryIterator.hasNext()) {
final Map.Entry<K, V> entry = entryIterator.next();
sj.add(entry.getKey() + " = " + entry.getValue());
}
return sj.toString();
关于java - 如何为集合实现 toString() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25644464/