使用流将对象列表转换为从 toString 方法获得的字符串

新手上路,请多包涵

Java 8 中有很多有用的新东西。例如,我可以用流遍历对象列表,然后对 Object 的实例的特定字段的值求和。例如

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

Suppose that list contains integers 1 , 2 and 3 , I expect that concatenated is "123""1,2,3"

原文由 mat_boy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 473
2 个回答

一种简单的方法是将列表项附加到 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 流,然后将其缩减为所有元素的串联。

注意:这是 normal reduction 在 O(n 2 ) 中执行

为了获得更好的性能,请使用 StringBuildermutable reduction 类似于 F. Böller 的回答。

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

参考: 流减少

原文由 Shail016 发布,翻译遵循 CC BY-SA 4.0 许可协议

API中有一个收集器 joining 。它是 Collectors 中的静态方法。

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

不完美,因为需要调用 toString ,但有效。可以使用不同的分隔符。

原文由 F. Böller 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题