如何 toString() 像这样的列表:List<Option>?

How to toString() a List like this one : List<Option>?

假设我有一个名为 Option 的对象的 list

List<Option> opts = ArrayList<Option>();

我已覆盖对象 Option toString()

当我执行 opts.toString() 时,这意味着我对 List 执行 toString ,我得到一些不必要的逗号 ,

我想改变这一点。拜托,有没有比在 List 中循环到 toString 每个元素更好的方法?希望我清楚。

我想覆盖 ArrayListtoString 不是个好主意,但您可以在应用程序的某些实用程序 class 中创建自己的打印函数:

public static String myToString(List<?> list) {
    StringBuilder stringList = new StringBuilder();
    String delimiter = " ";
    for (int c = 0; c < list.size(); c++) {
        stringList.append(delimiter);
        stringList.append(list.get(c));
    }
    return stringList.toString();
}

如果您使用的是 Java 8 Optional,它将如下所示:

List<Optional<String>> opts = Arrays.asList(
   Optional.of("bli"),
   Optional.<String>empty(),
   Optional.of("bla"));

String result = opts.stream().filter(Optional::isPresent).map(Optional::get).collect(Collectors.joining(", "));

导致 "bli, bla" 没有任何额外的逗号。

如果您不能使用官方 Optional class,您可以更改您的 Option 以实现类似的行为吗?

顺便说一句:有了 Java 9,您甚至可以用 flatMap(Optional::stream).

代替笨拙的 filter(Optional::isPresent).map(Optional::get)

如果您希望将字符串表示粘合在一起,您可以使用

opts.stream().map(Object::toString).collect(Collectors.joining()));

但如果您只想去掉逗号,即保留 space 作为分隔符,您可以将其自定义为

opts.stream().map(Object::toString).collect(Collectors.joining(" ")));

或者,如果您担心 过时的 分隔符,即您不希望空字符串之间有分隔符,请使用

opts.stream().map(Object::toString)
    .filter(s->!s.isEmpty()).collect(Collectors.joining(" "))

如果您错过了方括号,请使用

opts.stream().map(Object::toString).collect(Collectors.joining(" ", "[", "]"))

opts.stream().map(Object::toString)
    .filter(s->!s.isEmpty()).collect(Collectors.joining(" ", "[", "]"))