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



>我有一个字符串流:

Stream<String> stream = ...;

我想使用

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

如果流不包含任何元素,只有我想返回"无字符串"。

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

对于我的项目,我需要在很多地方使用此功能,所以我需要一个实现Collector接口的类。

我知道这可以通过流到列表来完成,然后检查 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

老实说,我会采用你目前的方法(测试空虚(。

但是如果你真的想使用一个直接的收集器,你可以使用 Collections.joining 的源代码和 StringJoiner 的 Javadoc 作为制作自定义收集器的指南:

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

最新更新