2

我在从对象列表生成逗号分隔字符串时遇到问题。此链接中解释了该问题将列表对象中的字符串转换为逗号分隔

我已经通过使用 toString 方法解决了这个问题。以前我使用 toString() 方法作为字符串生成器来进行调试。当我使用它来生成逗号分隔值时,我无法像以前那样调试它。

有没有办法实现两者?

4

3 回答 3

7

应该有一个单独的对象来处理格式化。这就是为什么您会在 java.text 中看到日期和数字的格式化对象,因为有很多不同的格式,您需要与数据对象分开的专用格式化程序。

查看toString用途,javadoc中给出的描述

返回对象的字符串表示形式。通常,toString 方法返回一个“以文本方式表示”该对象的字符串。结果应该是一个简洁但信息丰富的表示,易于人们阅读。建议所有子类重写此方法。

Odersky/Spoon/Venners 的书Programming in Scala说:

的结果toString主要旨在通过提供可用于调试打印语句、日志消息、测试失败报告以及解释器和调试器输出的信息来帮助程序员。

同样有效的 Java(第 10 项:始终覆盖toString)似乎假设 toString 的目的是在调试或记录时向开发人员提供诊断信息。

我会保留您用于调试的 toString 的实现,并创建一个单独的 CSV 格式对象来处理 csv 生成。这样 toString 的目的仍然是调试,在对象作为数据持有者的工作和 CSV 生成之间保持关注点分离。

于 2013-09-12T15:53:27.193 回答
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();
  }
}

然后,将该包装器对象添加为您的“列”,您的数据将正确显示。

于 2013-09-12T15:56:55.413 回答
0

用一些番石榴魔法和龙目岛(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)。

参考:番石榴龙目岛

于 2013-09-12T16:01:35.380 回答