首页 > 解决方案 > 使用 System.out::print 打印 String[] 时如何附加分隔符字符串?

问题描述

我正在努力学习并习惯使用 lambda、流和方法引用——所有新奇的 Java 11 东西。

我想对字符串数组进行排序并打印出来,保持 null 不变。在最后一行中,如何打印带有空格的名称?(一般情况是用消息打印每个名称)。当前输出为:

nullGoyleMalfoyCrabbe

我想

null 高尔·马尔福·克拉布

最后一个元素后没有空格。

ArrayList<String> enemies = new ArrayList<>(Arrays.asList("Malfoy", "Crabbe", "Goyle", null));
List<String> es = enemies.stream().map(object -> Objects.toString(object,null)).collect(Collectors.toList());
String[] as = es.toArray(String[]::new);
Arrays.sort(as, Comparator.nullsFirst((a,b) -> a.length() - b.length()));
Arrays.stream(as).forEach(System.out::print);

标签: javajava-stream

解决方案


最简单的解决方案是在每个列表条目后添加一个空格:

Arrays.stream(as).map(s -> s + " ").forEach(System.out::print);

但这也会在最后添加一个空格。

从 Java 8 开始StringJoiner,可以配置分隔符、前缀和后缀:

StringJoiner s = new StringJoiner("my separator", "my prefix", "my suffix");
s.add("str 1");
s.add("str 2");
System.out.print(s.toString());

还有一个Collector可以加入Streams (StringJoiner在引擎盖下使用):

String s = myStream.collect(Collectors.joining("my separator", "my prefix", "my suffix"));
System.out.print(s);

StringJoiner只在元素之间添加分隔符,而不是在末尾。如果你想在最后添加一些东西,StringJoiner你必须添加一个后缀。


推荐阅读