我在从对象列表生成逗号分隔字符串时遇到问题。此链接中解释了该问题将列表对象中的字符串转换为逗号分隔
我已经通过使用 toString 方法解决了这个问题。以前我使用 toString() 方法作为字符串生成器来进行调试。当我使用它来生成逗号分隔值时,我无法像以前那样调试它。
有没有办法实现两者?
我在从对象列表生成逗号分隔字符串时遇到问题。此链接中解释了该问题将列表对象中的字符串转换为逗号分隔
我已经通过使用 toString 方法解决了这个问题。以前我使用 toString() 方法作为字符串生成器来进行调试。当我使用它来生成逗号分隔值时,我无法像以前那样调试它。
有没有办法实现两者?
应该有一个单独的对象来处理格式化。这就是为什么您会在 java.text 中看到日期和数字的格式化对象,因为有很多不同的格式,您需要与数据对象分开的专用格式化程序。
查看toString
用途,javadoc中给出的描述是
返回对象的字符串表示形式。通常,toString 方法返回一个“以文本方式表示”该对象的字符串。结果应该是一个简洁但信息丰富的表示,易于人们阅读。建议所有子类重写此方法。
Odersky/Spoon/Venners 的书Programming in Scala说:
的结果
toString
主要旨在通过提供可用于调试打印语句、日志消息、测试失败报告以及解释器和调试器输出的信息来帮助程序员。
同样有效的 Java(第 10 项:始终覆盖toString
)似乎假设 toString 的目的是在调试或记录时向开发人员提供诊断信息。
我会保留您用于调试的 toString 的实现,并创建一个单独的 CSV 格式对象来处理 csv 生成。这样 toString 的目的仍然是调试,在对象作为数据持有者的工作和 CSV 生成之间保持关注点分离。
除了将处理过的字符串(例如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();
}
}
然后,将该包装器对象添加为您的“列”,您的数据将正确显示。
用一些番石榴魔法和龙目岛(for @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)。