我在从对象列表生成逗号分隔字符串时遇到问题。 此链接Convert string in list objects to comma separated
中解释了此问题我通过使用toString方法解决了这个问题。以前我使用toString()方法作为字符串构建器进行调试。由于我使用它来生成逗号分隔值,我无法像以前那样调试它。
无论如何都要完成两者?
答案 0 :(得分:7)
应该有一个单独的对象来处理格式化。这就是为什么你在java.text中看到日期和数字的格式化对象的原因,因为有太多不同的格式,你需要与数据对象分开的专用格式化程序。
查看toString
的用途,description given in the javadoc是
返回对象的字符串表示形式。一般来说, toString方法返回一个“文本表示”的字符串 宾语。结果应该是简洁但信息丰富的表示 一个人很容易阅读。建议所有人 子类重写此方法。
Odersky / Spoon / Venners预订 Scala编程说:
toString
的结果主要是为了帮助程序员 提供可在调试打印语句中使用的信息,日志 消息,测试失败报告以及解释器和调试器输出。
Effective Java (第10项:始终覆盖toString
)似乎假设toString的目的是在调试或记录时向开发人员提供诊断信息。
我将保留用于调试的toString的实现,并创建一个单独的CSV格式化对象来处理csv生成。这样,toString的目的仍然是调试,在对象作为数据持有者的工作和CSV生成之间保持关注点的分离。
答案 1 :(得分:0)
除了将已处理的字符串(例如col5.getId()
和user.getAddress().getAddress1()
)添加到列表(这可能是最好和最简单的答案)之外,您还可以编写一个覆盖的包装器toString
:
public class AddressForCsv {
private final Address address;
public AddressForCsv(Address address) {
this.address = address;
}
@Override public String toString() {
return address.getAddress1();
}
}
然后,将该包装器对象添加为“列”,您的数据将正确显示。
答案 2 :(得分:0)
使用一些番石榴魔法和lombok(@Data
):
@Data
public class Employee {
private String name;
private int age;
}
final List<Employee> employees = Lists.newArrayList(new Employee("Emp 1",25), new Employee ("Emp 2",25));
final List<Employee> names = Lists.newArrayList(Lists.transform(empList, new Function<Employee, String>() {
@Override
private String apply(final Employee e) {
return e.getName();
}
}));
// names = [Emp 1, Emp 2]
final String output = Joiner.on(", ").join(names);
// output = "Emp 1, Emp 2"
请注意,Function
不必是匿名类,而Employee
通常生成toString()
(来自lombok)。