Why StringJoiner when we already have StringBuilder?

后端 未结 5 1692
渐次进展
渐次进展 2020-12-01 04:30

I recently encountered with a Java 8 class StringJoiner which adds the String using the delimiters and adds prefix and suffix to it, but I can\'t understand the need of this

相关标签:
5条回答
  • 2020-12-01 04:30

    StringJoiner is very useful, when you need to join Strings in a Stream.

    As an example, if you have to following List of Strings:

    final List<String> strings = Arrays.asList("Foo", "Bar", "Baz");
    

    It is much more simpler to use

    final String collectJoin = strings.stream().collect(Collectors.joining(", "));
    

    as it would be with a StringBuilder:

    final String collectBuilder =
        strings.stream().collect(Collector.of(StringBuilder::new,
            (stringBuilder, str) -> stringBuilder.append(str).append(", "),
            StringBuilder::append,
            StringBuilder::toString));
    

    EDIT 6 years later As noted in the comments, there are now much simpler solutions like String.join(", ", strings), which were not available back then. But the use case is still the same.

    0 讨论(0)
  • 2020-12-01 04:36

    StringJoiner is a kind of a Collector, although it doesn't implement the Collector interface. It just behaves as such. Besides you can pass delimiter, prefix and suffix, the StringJoiner may be employed to create formatted output from a Stream invoking Collectors.joining(CharSequence).

    This is especially useful when working with parallel streams, because at some point the batches that are being process in parallel will need to be joined and this is where the StringJoiner takes place.

    0 讨论(0)
  • 2020-12-01 04:37

    It may simplify your code in some use cases:

    List<String> list = // ...;
    
    // with StringBuilder
    StringBuilder builder = new StringBuilder();
    builder.append("[");
    if (!list.isEmpty()) {
        builder.append(list.get(0));
        for (int i = 1, n = list.size(); i < n; i++) {
            builder.append(",").append(list.get(i));
        }
    }
    builder.append("]");
    
    // with StringJoiner
    StringJoiner joiner = new StringJoiner(",", "[", "]");
    for (String element : list) {
        joiner.add(element);
    }
    
    0 讨论(0)
  • 2020-12-01 04:48

    StringJoiner is far simpler than using StringBuilder. A very simple code is like

    StringJoiner sj = new StringJoiner(",");
            sj.add("aaa");
            sj.add("bbb");
            sj.add("ccc");
            String result = sj.toString(); //aaa,bbb,ccc
    
    0 讨论(0)
  • 2020-12-01 04:51

    The examples on the StringJoiner Javadoc are very good at covering this. The whole point to to abstract away the choice of seperator from the act of adding entries. e.g. you can create a joiner, specify the seperator to use and pass it to a library to do the adding of elements or visa versa.

    The String "[George:Sally:Fred]" may be constructed as follows:

    StringJoiner sj = new StringJoiner(":", "[", "]");
    sj.add("George").add("Sally").add("Fred");
    String desiredString = sj.toString();
    

    A StringJoiner may be employed to create formatted output from a Stream using Collectors.joining(CharSequence). For example:

    List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
    String commaSeparatedNumbers = numbers.stream()
        .map(i -> i.toString())
        .collect(Collectors.joining(", "));
    
    0 讨论(0)
提交回复
热议问题