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)