【问题标题】:converting elements of a list to string将列表的元素转换为字符串
【发布时间】:2011-01-08 14:54:20
【问题描述】:

我想获取存储在列表中的元素的字符串文本,比如List<Car>。 toArray() 和 toString() 方法会是最好的选择吗?

【问题讨论】:

    标签: java string list collections


    【解决方案1】:

    是的,但是手动操作可以让您获得更多控制权:

    // initialize with the exact length
    List<String> stringsList = new ArrayList<String>(listOfCars.size()); 
    for (Car car : listOfCars) {
        stringsList.add(car.toString());   
    }
    

    如果您尚未覆盖 toString() 方法或不想覆盖它,则可以使用 car.getName() 代替 car.toString()(或您喜欢的任何属性组合)

    【讨论】:

      【解决方案2】:
      for (Car car : carsList) {  // carsList is the object of List<Car>
          System.out.println(car);
      }
      

      注意:只有当你重写 Car 类的 toString() 方法时,上面才会显示有意义的消息。

      例如

      public class Car {
      
          private String carName;
      
          ....
          ....
      
          public String toString() {
              return carName;
          }
      }
      

      toString() 方法应该被重写,以字符串形式返回有关对象的有意义的信息。

      在你的情况下,我认为有意义的信息将是汽车的所有细节。所以重写 toString() 方法是最好的方法,而不是使用 getCarName() 或类似方法。

      【讨论】:

        【解决方案3】:

        有一个static toString(Object[]) 方法和一个java.util.Arrays。使用列表的toArray() 结果调用它(如您所建议的)应该可以完成这项工作。

        【讨论】:

        • 为什么不直接调用列表上的toString()呢?
        • @Adamski:接口 List 没有为 toString() 定义合约。
        • 如果需要还有deepToString()
        【解决方案4】:

        如果您不反对遵循约定的字符串输出:

        [A, B, C]
        

        ...您可以简单地调用List'stoString() 方法来获取您的输出(我不确定为什么人们提倡为此使用循环)。覆盖 Car 的 toString() 方法以返回对象的人性化描述也是明智的。

        但是,如果您希望将每个元素作为单独的 String 获取,则需要一次遍历 List 一个元素。

        【讨论】:

        • 你怎么能确定输出看起来像这样? List 只是一个接口,List 中的 toString() 方法的输出没有约定。
        • @Dominik:这是一个公平的观点,但我猜在 99.9% 的情况下,人们倾向于使用 List 的 JDK 实现,它确实会产生这种风格的输出。我倾向于将此输出用于调试日志记录,但绝不会依赖它用于表示级逻辑。
        • 这是正确的方法imho,因为它来自AbstractCollection#toString,它的实现应该从JDK中扩展并且集合类型这样做。
        【解决方案5】:

        另一种思路是使用Apache Commons Lang编写如下代码:

        StringUtils.join(myList);
        

        有趣的是你也可以提供一个分隔符,例如:

        StringUtils.join(myList, " ; ");
        

        【讨论】:

          【解决方案6】:

          首先将您的列表(集合)转换为数组,并为每个元素创建一个字符串。

          Arrays.toString(myCollection.toArray());
          

          【讨论】:

            【解决方案7】:

            您可以使用 Java 8 Streams

            List<Car> carList = new ArrayList<>();
            //Add some elemts to carList
            carList.stream()
            .map(Car::toString) // maps Car Object to a value returned by toString method
            .collect(Collectors.joining(","));
            

            有关更多信息,请参阅JavaDoc Collectors

            【讨论】:

            • 我在单独的答案中发布了一些额外的 Collectors.joining() 示例。编辑有点多!如果您愿意,请随意将我的答案复制到您的答案中,以便将其放在一个地方。然后我将删除我的答案。
            【解决方案8】:

            我不想单独给出与 hkbharath 不同的答案,这是一个很好的答案,但我确实想给出更多使用 Java 8 流的示例。 Collectors.joining() 有几个不同的重载变体。

            假设他的例子中的代码:

            carList.stream()
            .map(Car::toString) // maps Car Object to a value returned by toString method
            .collect(Collectors.joining(","));
            

            给你这个:福特、本田、别克

            那么如果你不需要分隔符:

            carList.stream()
            .map(Car::toString) // maps Car Object to a value returned by toString method
            .collect(Collectors.joining());
            

            会给你:福特本田别克

            下面是一个扩展示例,展示了如何操作每个字符串、更改分隔符以及添加前缀和后缀:

            carList.stream()
            .map(Car::toString) // maps Car Object to a value returned by toString method
            .map(String::toUpperCase) // Transform to upper case
            .collect(Collectors.joining("; ", "[", "]"));
            

            会给你:[福特;本田;别克]

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-12-23
              • 2018-05-07
              • 1970-01-01
              • 1970-01-01
              • 2022-01-19
              • 2023-04-07
              相关资源
              最近更新 更多