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”。
一种简单的方法是在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(","));
参考:流还原
我将使用streams api将整数流转换为单个字符串。提供的一些答案的问题是,由于构建String,它们产生了O(n²)运行时。更好的解决方案是使用StringBuilder,然后在最后一步将字符串连接在一起。
// Create a stream of integers
String result = Arrays.stream(new int[]{1,2,3,4,5,6 })
// collect into a single StringBuilder
.collect(StringBuilder::new, // supplier function
// accumulator - converts cur integer into a string and appends it to the string builder
(builder, cur) -> builder.append(Integer.toString(cur)),
// combiner - combines two string builders if running in parallel
StringBuilder::append)
// convert StringBuilder into a single string
.toString();
您可以通过将object的集合转换为单个字符串来进一步执行此过程。
// Start with a class definition
public static class AClass {
private int value;
public int getValue() { return value; }
public AClass(int value) { this.value = value; }
@Override
public String toString() {
return Integer.toString(value);
}
}
// Create a stream of AClass objects
String resultTwo = Arrays.stream(new AClass[]{
new AClass(1),
new AClass(2),
new AClass(3),
new AClass(4)
})
// transform stream of objects into a single string
.collect(StringBuilder::new,
(builder, curObj) -> builder.append(curObj.toString()),
StringBuilder::append
)
// finally transform string builder into a single string
.toString();
以防有人试图在没有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来分隔元素,如果您的数据中可能包含逗号,如果您的数据中有方括号,则使用子字符串版本,但对于数字数组来说,它几乎是完美的。