Java 8中有很多有用的新功能。例如,我可以在对象列表上迭代流,然后从对象实例的特定字段中求和。如。

public class AClass {
  private int value;
  public int getValue() { return value; }
}

Integer sum = list.stream().mapToInt(AClass::getValue).sum();

因此,我询问是否有任何方法可以构建一个String,将来自实例的toString()方法的输出连接到一行中。

List<Integer> list = ...

String concatenated = list.stream().... //concatenate here with toString() method from java.lang.Integer class

假设列表包含整数1,2,3,我期望连接的是“123”或“1,2,3”。


当前回答

API中加入了一个收集器。 它是collections中的一个静态方法。

list.stream().map(Object::toString).collect(Collectors.joining(","))

由于必须调用toString,所以并不完美,但可以工作。可以使用不同的分隔符。

其他回答

一种简单的方法是在StringBuilder中添加列表项

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);

StringBuilder b = new StringBuilder();
list.forEach(b::append);

System.out.println(b);

你也可以试试:

String s = list.stream().map(e -> e.toString()).reduce("", String::concat);

解释:map将Integer流转换为String流,然后将其简化为所有元素的连接。

注:这是O(n2)下的正常还原

为了获得更好的性能,请使用StringBuilder或类似F. Böller的答案的可变简化。

String s = list.stream().map(Object::toString).collect(Collectors.joining(","));

参考:流还原

API中加入了一个收集器。 它是collections中的一个静态方法。

list.stream().map(Object::toString).collect(Collectors.joining(","))

由于必须调用toString,所以并不完美,但可以工作。可以使用不同的分隔符。

StringListName = ObjectListName.stream()。map(m -> m. tostring())。collect(collections . tolist ());

其他答案都没问题。但是,你也可以将collections . tolist()作为参数传递给Stream.collect(),以数组列表的形式返回元素。

System.out.println( list.stream().map( e -> e.toString() ).collect( toList() ) );

一种简单的方法是将列表中的元素映射到字符串,然后使用Collectors类中的连接操作。

List<Integer> ls = new ArrayList<Integer>();
ls.add(1);
ls.add(2);
ls.add(3);
String s = ls.stream().map(Object::toString).collect(Collectors.joining(","));