意外的String.join()行为

Vis*_*tna 5 java java-8

我尝试在它们之间打印List<String>带有" , "的内容.按照Venkat Subramaniam的Java函数编程一书,第54页,他完成了我正在做的事情,但我的打印结果是一个没有逗号的单个字符串(,).

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));
}
Run Code Online (Sandbox Code Playgroud)

输出:AlexnullpointerEranGeorge

预期:Alex,nullpointer,Eran,George


我尝试了另一种方式并且工作正常,我只想知道在上述方法中我做错了什么,而在书中Venkat也做了我正在做的事情?

 System.out.println(Arrays.stream(deepArrayStr)
        .flatMap(Arrays::stream)
        .collect(Collectors.joining(",")));
Run Code Online (Sandbox Code Playgroud)

输出:Alex,nullpointer,Eran,George

预期:Alex,nullpointer,Eran,George

我的问题是不要转换Liststring打印时添加分隔符.

Jon*_*eet 23

您正在遍历列表,并且String.join每次都使用单个条目进行调用.那永远不会使用分隔符.

为清楚起见,请考虑以下两个示例:

String x1 = String.join(",", "a");
String x2 = String.join(",", "a", "b");
Run Code Online (Sandbox Code Playgroud)

那么值x1将是"a",并且值x2将是"a,b".String.join项目之间添加分隔符- 因此,如果您只传递一个项目,则不需要添加任何分隔符.

您可以删除for循环,并将其替换为:

System.out.println(String.join(",", str));
Run Code Online (Sandbox Code Playgroud)


Era*_*ran 11

System.out.print(String.join(",",s));
Run Code Online (Sandbox Code Playgroud)

您正在String向每个String.join呼叫传递一个,因此它当然不会添加任何分隔符.如果你传递多个Strings ,它只会添加分隔符(在你的情况下为逗号).

例如,如果您将数据收集StreamString数组而不是a List,则可以将该数组传递给String.join:

String[] str = Arrays.stream(deepArrayStr)
                     .flatMap(Arrays::stream)
                     .toArray(String[]::new);
System.out.println (String.join (",", str));
Run Code Online (Sandbox Code Playgroud)

这将输出:

Alex,nullpointer,Eran,George
Run Code Online (Sandbox Code Playgroud)


Nam*_*man 5

尽管答案已经突出了差异和可能的解决方法,但这只是为了使其在比较中更具功能性:

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

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
Run Code Online (Sandbox Code Playgroud)

另一方面,后者只是这样做:

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

参考String.join及其相关实现Collectors.joining及其功能。