如何打印由分隔符分隔的集合元素,而不创建大字符串?

时间:2015-04-30 08:55:03

标签: java performance java-8

非常相似的问题很接近,因为有人将其标记为问题的副本:"A quick and easy way to join array elements with a separator (the opposite of split) in Java"

我期望产生代表集合的庞大字符串不是最好的方法。只是提供一个方法实现。感谢。

3 个答案:

答案 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