自定义收集器仅在流不是空后缀时才在定界符、后缀和前缀上加入流
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)
我有一个字符串流:
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)