【发布时间】:2011-01-08 14:54:20
【问题描述】:
我想获取存储在列表中的元素的字符串文本,比如List<Car>。 toArray() 和 toString() 方法会是最好的选择吗?
【问题讨论】:
标签: java string list collections
我想获取存储在列表中的元素的字符串文本,比如List<Car>。 toArray() 和 toString() 方法会是最好的选择吗?
【问题讨论】:
标签: java string list collections
是的,但是手动操作可以让您获得更多控制权:
// 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()(或您喜欢的任何属性组合)
【讨论】:
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() 或类似方法。
【讨论】:
有一个static toString(Object[]) 方法和一个java.util.Arrays。使用列表的toArray() 结果调用它(如您所建议的)应该可以完成这项工作。
【讨论】:
deepToString()
如果您不反对遵循约定的字符串输出:
[A, B, C]
...您可以简单地调用List'stoString() 方法来获取您的输出(我不确定为什么人们提倡为此使用循环)。覆盖 Car 的 toString() 方法以返回对象的人性化描述也是明智的。
但是,如果您希望将每个元素作为单独的 String 获取,则需要一次遍历 List 一个元素。
【讨论】:
另一种思路是使用Apache Commons Lang编写如下代码:
StringUtils.join(myList);
有趣的是你也可以提供一个分隔符,例如:
StringUtils.join(myList, " ; ");
【讨论】:
首先将您的列表(集合)转换为数组,并为每个元素创建一个字符串。
Arrays.toString(myCollection.toArray());
【讨论】:
您可以使用 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。
【讨论】:
我不想单独给出与 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("; ", "[", "]"));
会给你:[福特;本田;别克]
【讨论】: