非常相似的问题很接近,因为有人将其标记为问题的副本:"A quick and easy way to join array elements with a separator (the opposite of split) in Java"。
我期望产生代表集合的庞大字符串不是最好的方法。只是提供一个方法实现。感谢。
答案 0 :(得分:2)
如果你只需要打印元素并且你担心构建一个巨大的String只是为了打印它,你仍然可以编写一个很好的旧的for循环,逐个打印元素,然后是分隔符。
我的意思是新的Java 8功能不会弃用这些结构。
例如,如果需要,您可以编写实用程序方法:
public static void printCollection(Collection<?> coll, String delimiter) {
int size = coll.size();
int i = 0;
for(Object elem : coll) {
System.out.print(elem);
if(++i < size) {
System.out.print(delimiter);
}
}
}
使用Java 8,你可以使这个更紧凑:
public static void printCollection(Collection<?> coll, String delimiter) {
//you can still avoid the map call and use two print statements in the forEach
coll.stream().limit(coll.size()-1).map(o -> o+delimiter).forEach(System.out::print);
coll.stream().skip(coll.size()-1).forEach(System.out::print);
}
答案 1 :(得分:1)
在一般情况下,输入集合可能包含数千或数百万个元素,因此比生成巨大的String对象更好的方法是将打印定向到特定的输出流。
在我的转储实现中,我只是遍历集合。分离打印步骤以避免为每个concat操作(element.toString()+ delimiter)创建新的String。 由于@Pshemo注意到Stream API方法“即使在最后一个元素之后也将最终打印分隔符”。
public static <T> void nicePrint(final Collection<T> collection,
final PrintStream printStream,
final Optional<String> delimiter) {
final Iterator<T> iterator = collection.iterator();
while (iterator.hasNext()) {
printStream.print(iterator.next());
if (iterator.hasNext()) {
delimiter.ifPresent(printStream::print);
}
}
}
使用示例:
final String DELIMITER = ", ";
nicePrint(Arrays.asList(1, 2, 3), printStream, Optional.of(DELIMITER));
答案 2 :(得分:1)
根据我的理解,您正在寻找Scala的mkString能力。
public static String mkString(Stream<String> s, String delimeter){
return s.collect(Collectors.joining(delimeter));
}
System.out.println(print(Stream.of("1", "2", "3"), ", "));
//prints: 1, 2, 3