Java 意外的String.join()行为

Java 意外的String.join()行为,java,java-8,Java,Java 8,我试图打印一个列表的内容,中间有一个“,”。在Venkat Subramaniam的《Java函数式编程》一书的第54页上,他做了与我完全相同的事情,但我的打印结果是一个字符串,没有逗号(,) 输出:亚历克斯、空指针、埃兰、乔治 预期的:Alex、nullpointer、Eran、George 我的问题不是从列表转换为字符串,而是在打印时添加分隔符 System.out.print(String.join(",",s)); 您正在向每个字符串传递一个字符串。加入调用,因此它当然不会添加任何分隔

我试图打印一个
列表的内容,中间有一个“”。在Venkat Subramaniam的《Java函数式编程》一书的第54页上,他做了与我完全相同的事情,但我的打印结果是一个字符串,没有逗号
(,)

输出
亚历克斯、空指针、埃兰、乔治

预期的
Alex、nullpointer、Eran、George

我的问题不是从
列表
转换为
字符串
,而是在打印时添加分隔符

System.out.print(String.join(",",s));
您正在向每个
字符串传递一个
字符串。加入
调用,因此它当然不会添加任何分隔符。如果您传递多个
String
s,则它仅添加分隔符(在您的示例中为逗号)

例如,如果您要将
收集到
字符串
数组而不是
列表
,则可以将该数组传递到
字符串。加入

String[] str = Arrays.stream(deepArrayStr)
                     .flatMap(Arrays::stream)
                     .toArray(String[]::new);
System.out.println (String.join (",", str));
这将输出:

Alex,nullpointer,Eran,George

您正在对列表进行迭代,并调用
String.join
,每次只调用一个条目。这永远不会使用分隔符

为了说明这一点,请考虑这两个例子:

String x1 = String.join(",", "a");
String x2 = String.join(",", "a", "b");
然后
x1
的值将是“a”,而
x2
的值将是“a,b”
String.join
只在项目之间添加分隔符-因此,如果只传递单个项目,则不需要添加任何分隔符

您只需删除
for
循环,并将其替换为:

System.out.println(String.join(",", str));

虽然答案已经强调了差异和可能的修复,但这只是为了使其相比之下更具功能性:

您的第一段代码可以转换为:

Arrays.stream(deepArrayStr)
        .flatMap(Arrays::stream)
        .map(s -> String.join(",", s)) //map each string 'if possible' joined by delimeter ,
        .forEach(System.out::print); //print the above mapped string
而另一方面,后者只是这样做:

System.out.println(Arrays.stream(deepArrayStr)
    .flatMap(Arrays::stream)
    .collect(Collectors.joining(","))); //join strings and collect to print (after that)

参考及其相关实现和功能。

请参阅Venkat的示例,如果我做了任何不同的操作,请更正我。注意:您也可以使用收集器连接字符串:
.collector(收集器.joining(“,”)
)。当然,生成的对象将是
String
,而不是
List
。您可以将列表传递到
String.join
中-有一个重载接受
Iterable
@JonSkeet感谢您的评论。我错过了重载。先生,我想知道为什么每次循环中都没有添加分隔符???@CommonMan:因为您只传递一个字符串。如果调用
string.Join(“,”和“foo”)
结果总是“foo”。@CommonMan:我编辑了我的答案,以澄清string.Join的行为,只使用一个元素。
Arrays.stream(deepArrayStr)
        .flatMap(Arrays::stream)
        .map(s -> String.join(",", s)) //map each string 'if possible' joined by delimeter ,
        .forEach(System.out::print); //print the above mapped string
System.out.println(Arrays.stream(deepArrayStr)
    .flatMap(Arrays::stream)
    .collect(Collectors.joining(","))); //join strings and collect to print (after that)