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”。
List<String> list = Arrays.asList("One", "Two", "Three");
list.stream()
.reduce("", org.apache.commons.lang3.StringUtils::join);
Or
List<String> list = Arrays.asList("One", "Two", "Three");
list.stream()
.reduce("", (s1,s2)->s1+s2);
这种方法还允许您从对象列表构建字符串结果
例子
List<Wrapper> list = Arrays.asList(w1, w2, w2);
list.stream()
.map(w->w.getStringValue)
.reduce("", org.apache.commons.lang3.StringUtils::join);
在这里,reduce函数允许你有一些初始值,你想追加一个新字符串
例子:
List<String> errors = Arrays.asList("er1", "er2", "er3");
list.stream()
.reduce("Found next errors:", (s1,s2)->s1+s2);
以防有人试图在没有java 8的情况下做到这一点,这里有一个非常好的技巧。List.toString()已经返回一个类似这样的集合:
[1, 2, 3]
根据您的具体要求,只要您的列表项不包含[]或,就可以将其后处理为您想要的任何内容。
例如:
list.toString().replace("[","").replace("]","")
或者如果你的数据可能包含方括号:
String s=list.toString();
s = s.substring(1,s.length()-1)
会得到一个相当合理的输出。
每行上可以创建一个数组项,如下所示:
list.toString().replace("[","").replace("]","").replaceAll(",","\r\n")
我使用这种技术从一个小应用程序的列表中制作html工具提示,如下所示:
list.toString().replace("[","<html>").replace("]","</html>").replaceAll(",","<br>")
如果你有一个数组,那么从Arrays.asList(list).toString()开始
我完全承认这不是最优的事实,但它并不像您想象的那么低效,而且很容易阅读和理解。然而,它是相当不灵活的——特别是不要尝试用replaceAll来分隔元素,如果您的数据中可能包含逗号,如果您的数据中有方括号,则使用子字符串版本,但对于数字数组来说,它几乎是完美的。
测试Shail016和bpedroso answer (https://stackoverflow.com/a/24883180/2832140)中建议的两种方法,即for循环中的简单StringBuilder + append(String),似乎比list.stream().map([…])执行得快得多。
示例:这段代码遍历一个Map<Long, List<Long>>构建一个json字符串,使用List .stream().map([…]:
if (mapSize > 0) {
StringBuilder sb = new StringBuilder("[");
for (Map.Entry<Long, List<Long>> entry : threadsMap.entrySet()) {
sb.append("{\"" + entry.getKey().toString() + "\":[");
sb.append(entry.getValue().stream().map(Object::toString).collect(Collectors.joining(",")));
}
sb.delete(sb.length()-2, sb.length());
sb.append("]");
System.out.println(sb.toString());
}
在我的dev VM上,junit通常需要0.35到1.2秒来执行测试。然而,使用下面的代码,它需要0.15到0.33秒:
if (mapSize > 0) {
StringBuilder sb = new StringBuilder("[");
for (Map.Entry<Long, List<Long>> entry : threadsMap.entrySet()) {
sb.append("{\"" + entry.getKey().toString() + "\":[");
for (Long tid : entry.getValue()) {
sb.append(tid.toString() + ", ");
}
sb.delete(sb.length()-2, sb.length());
sb.append("]}, ");
}
sb.delete(sb.length()-2, sb.length());
sb.append("]");
System.out.println(sb.toString());
}