自定义收集器仅在流不是空后缀时才在定界符、后缀和前缀上加入流

Custom Collector to join stream on delimiter, suffix and prefix only if stream is not empty suffix

我有一个字符串流:

Stream<String> stream = ...;

我想使用

创建一个字符串

stream.collect(Collectors.joining(',', '[', ']'))

如果流不包含任何元素,我只想 return“无字符串”。

我注意到 String java.util.stream.Stream.collect(Collector<? super String, ?, String> collector) 方法采用 java.util.stream.Collector

类型的参数

对于我的项目,我在很多地方都需要这个功能,所以我需要一个 class 来实现 Collector 接口。

我知道这可以通过 Stream 到列表然后检查 List.size() == 0 来完成?然后在需要时再次将列表转换为流。

List<String> list = stream.collect(Collectors.toList());

if (list.size() == 0) {
    return "No Strings";
}
return list.stream().collect(Collectors.joining(",", "[", "]"));`

这就是我希望发生的事情

List emptyList<String> = new ArrayList<>; System.out.println(emptyList.stream().collect(Collectors.joining(",", "[", "]")));

输出

[]

我想要的输出

No Strings

老实说,我会采用您当前的方法(测试是否为空)。

但如果你真的想使用直接收集器,你可以使用 the source code of Collections.joining and the Javadoc of StringJoiner 作为指南来制作自定义收集器:

Collector.of(
    () -> new StringJoiner(",", "[", "]").setEmptyValue("No strings"),
    StringJoiner::add,
    StringJoiner::merge,
    StringJoiner::toString)