java - 使用 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);
解决方案
最简单的解决方案是在每个列表条目后添加一个空格:
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
可以加入Stream
s (StringJoiner
在引擎盖下使用):
String s = myStream.collect(Collectors.joining("my separator", "my prefix", "my suffix"));
System.out.print(s);
StringJoiner
只在元素之间添加分隔符,而不是在末尾。如果你想在最后添加一些东西,StringJoiner
你必须添加一个后缀。
推荐阅读
- tensorflow - 带有数据的张量流工作函数
- javascript - 按下按钮时传递值
- php - PHP ODBC 数据类型不匹配 (MS Access)
- javascript - 用于 html 内文本的 javascript 荧光笔
- java - AspectJ、SpringAOP、Aspect 运行两次
- r - 根据现有变量的值创建一个新的指标变量
- android - 手机深度睡眠时与服务器通信
- c++ - 为什么我们在访问者模式中需要 accept() 以及为什么我们不能直接调用 visitor.visit()?
- c - 为什么 '?' 和 '\?' 在 C 中给出相同的输出?
- python - 我有一个对应于 2018 年第 1 周的 ISO 8601 周数(例如:201801)。pyth 中的最佳方法是什么