【发布时间】:2018-10-05 19:29:52
【问题描述】:
我有一个字符串流:
Stream<String> stream = ...;
我想构造一个字符串,将这些项目与, 作为分隔符连接起来。我这样做如下:
stream.collect(Collectors.joining(","));
现在我只想在有多个项目的情况下为此输出添加前缀 [ 和后缀 ]。例如:
a[a,b][a,b,c]
如果不首先将Stream<String> 实现为List<String>,然后检查List.size() == 1,是否可以做到这一点?在代码中:
public String format(Stream<String> stream) {
List<String> list = stream.collect(Collectors.toList());
if (list.size() == 1) {
return list.get(0);
}
return "[" + list.stream().collect(Collectors.joining(",")) + "]";
}
首先将流转换为列表,然后再转换为流以便能够应用Collectors.joining(","),这感觉很奇怪。我认为循环遍历整个流(在Collectors.toList() 期间完成)只是为了发现是否存在一个或多个项目是次优的。
我可以实现我自己的Collector<String, String>,它计算给定项目的数量并在之后使用该计数。但我想知道是否有更直接的方法。
这个问题故意忽略了流为空时的情况。
【问题讨论】:
-
“构造一个字符串”还是“构造一个流”?
-
Streams 有 count() 方法给出列表中元素的数量,这样你就不必具体化流,而是使用它而不是 list.size()跨度>
-
@AmanJ
count()是terminal operation。之后stream就不能再使用了,它被消耗掉了。 -
没有比制作自己的收藏家更直接的方法了。
-
这有点超出您的问题范围,但您可以重构代码的最后一行:stream.collect(Collectors.joining("-", "[", "]")); =))
标签: java string java-8 java-stream