我试图在它们之间用“,”打印List<String>
的内容。按照Venkat Subramaniam编写的Java函数编程一书,第54页,他完成了我正在做的事情,但我的打印结果是一个没有comma(,)
的单个字符串。
String[][] deepArrayStr = new String[][]{{"Alex", "nullpointer"}, {"Eran", "George"}};
List<String> str= Arrays.stream(deepArrayStr)
.flatMap(Arrays::stream)
.collect(Collectors.toList());
for(String s:str){
System.out.print(String.join(",",s));
}
输出:AlexnullpointerEranGeorge
预计:Alex,nullpointer,Eran,George
我尝试了另一种方式并且工作正常,我只是想知道在上述方法中我做错了什么,而在书中Venkat也做了我正在做的事情?
System.out.println(Arrays.stream(deepArrayStr)
.flatMap(Arrays::stream)
.collect(Collectors.joining(",")));
输出:Alex,nullpointer,Eran,George
预计:Alex,nullpointer,Eran,George
我的问题不是从List
转换为string
,而是在打印时添加分隔符。
您正在遍历列表,并且每次都使用单个条目调用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));
System.out.print(String.join(",",s));
你传递一个String
到每个String.join
调用,所以当然它不会添加任何分隔符。如果你传递多个String
s,它只会添加分隔符(在你的情况下为逗号)。
例如,如果您将Stream
收集到String
数组而不是List
,则可以将该数组传递给String.join
:
String[] str = Arrays.stream(deepArrayStr)
.flatMap(Arrays::stream)
.toArray(String[]::new);
System.out.println (String.join (",", str));
这将输出:
Alex,nullpointer,Eran,George
虽然答案已经突出了差异和可能的修复,但这只是为了使其更具功能性:
您的第一个代码块可以转换为:
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)
参考String.join
及其相关实现和Collectors.joining
及其功能。