Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 既然我们已经有了StringBuilder,为什么还要使用StringJoiner?_Java_String_Java 8_Stringbuilder - Fatal编程技术网

Java 既然我们已经有了StringBuilder,为什么还要使用StringJoiner?

Java 既然我们已经有了StringBuilder,为什么还要使用StringJoiner?,java,string,java-8,stringbuilder,Java,String,Java 8,Stringbuilder,我最近遇到了一个Java 8类,它使用分隔符添加字符串并向其添加前缀和后缀,但我无法理解这个类的需要,因为它也在后端使用,并且还执行非常简单的附加字符串的操作 我没有真正理解这门课的真正目的,是不是遗漏了什么?上的例子很好地涵盖了这一点。整个要点是从添加条目的行为中抽象出分隔符的选择。e、 你可以创建一个joiner,指定要使用的分隔符,并将其传递给库来添加元素,反之亦然 字符串“[George:Sally:Fred]”的构造如下: StringJoiner sj = new StringJoi

我最近遇到了一个Java 8类,它使用分隔符添加字符串并向其添加前缀和后缀,但我无法理解这个类的需要,因为它也在后端使用,并且还执行非常简单的附加字符串的操作

我没有真正理解这门课的真正目的,是不是遗漏了什么?

上的例子很好地涵盖了这一点。整个要点是从添加条目的行为中抽象出分隔符的选择。e、 你可以创建一个joiner,指定要使用的分隔符,并将其传递给库来添加元素,反之亦然

字符串“[George:Sally:Fred]”的构造如下:

StringJoiner sj = new StringJoiner(":", "[", "]");
sj.add("George").add("Sally").add("Fred");
String desiredString = sj.toString();
StringJoiner可用于使用Collector.joining(CharSequence)从流创建格式化输出。例如:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
String commaSeparatedNumbers = numbers.stream()
    .map(i -> i.toString())
    .collect(Collectors.joining(", "));
List number=Arrays.asList(1,2,3,4);
字符串commaSeparatedNumbers=numbers.stream()
.map(i->i.toString())
.collect(收集器。连接(“,”);

StringJoiner
是一种收集器,尽管它没有实现
Collector
接口。它的行为就是这样。除了可以传递分隔符、前缀和后缀外,还可以使用
StringJoiner
从调用
收集器的
流创建格式化输出


这在处理并行流时特别有用,因为在某个点上,并行处理的批将需要连接,而这正是发生
StringJoiner
的地方

在某些用例中,它可能会简化您的代码:

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);
}
List=/。。。;
//使用StringBuilder
StringBuilder=新的StringBuilder();
生成器。追加(“[”);
如果(!list.isEmpty()){
builder.append(list.get(0));
对于(int i=1,n=list.size();i当您需要在
流中连接字符串时,StringJoiner
非常有用

例如,如果必须创建以下字符串列表:

final List<String> strings = Arrays.asList("Foo", "Bar", "Baz");
与使用
StringBuilder时一样:

final String collectBuilder =
    strings.stream().collect(Collector.of(StringBuilder::new,
        (stringBuilder, str) -> stringBuilder.append(str).append(", "),
        StringBuilder::append,
        StringBuilder::toString));
6年后编辑
如评论中所述,现在有了更简单的解决方案,如
String.join(“,”,strings)
,这在当时是不可用的。但是用例仍然是一样的。

StringJoiner比使用StringBuilder简单得多。一个非常简单的代码如下

StringJoiner sj = new StringJoiner(",");
        sj.add("aaa");
        sj.add("bbb");
        sj.add("ccc");
        String result = sj.toString(); //aaa,bbb,ccc

实现简单并不妨碍在作为类单独执行时发挥作用。特别是当考虑到应用程序程序员必须手动(或通过第三方库)执行类似操作的频率时。不完全如此。它是一个低级实用程序组件,适合从收集器使用(joining()实际上使用它),但也适用于流之外的世界。人们一直在写这种循环。彼得,你对StringBuilder和StringJoiner的性能做过基准测试吗?在这方面,你更喜欢哪一个?@Simeon如果我想在我附加的每件事和字符串生成器之间使用一个隐式分隔符(如果不需要的话),我会使用String joiner。这不是关于性能,而是要使所需的操作更加清晰。请注意,这两个示例并不相同!第一个生成字符串
“foo,Bar,Baz”
,第二个生成
“foo,Bar,Baz”
@PaulWagland是的,这是
。连接的额外优点。通常,你不需要最后一个逗号…@Koshinae完全同意,在流媒体的情况下解决这个问题也会使已经很复杂的语句变得更加复杂
String.join(“,”,strings)
是对
strings.stream().collect(Collectors.join(“,”)
的更快版本:
list.stream().map(Util::quote).collector(Collectors.joining(“,”)
StringJoiner sj = new StringJoiner(",");
        sj.add("aaa");
        sj.add("bbb");
        sj.add("ccc");
        String result = sj.toString(); //aaa,bbb,ccc