如果 toList 返回空列表,则收集器返回 singletonList
Collector returning singletonList if toList returned empty list
我有一个很大的流管道,因此想保持它干净。我有以下部分更大的管道
Integer defaultInt;
//...
Stream<Integer> ints;
ints.filter(/* predicate_goes_here */).collect(toSingletonIfEmptyCollector);
其中 toSingletonIfEmptyCollector
如果 returns 非空列表和 Collections.singletonList(defaultInt)
如果 Collectors.toList()
返回空,则应该与 Collectors.toList()
相同。
是否有更短的方法来实现它(例如通过组合 JDK 中提供的标准收集器)而不是从头开始实现所有 Collector
的方法?
您可以使用 collectingAndThen
并在内置的 toList()
收集器上执行额外的整理操作,如果没有元素,它将 return 一个单例列表。
static <T> Collector<T, ?, List<T>> toList(T defaultValue) {
return Collectors.collectingAndThen(
Collectors.toList(),
l -> l.isEmpty() ? Collections.singletonList(defaultValue) : l
);
}
它会这样使用:
System.out.println(Stream.of(1, 2, 3).collect(toList(5))); // prints "[1, 2, 3]"
System.out.println(Stream.empty().collect(toList(5))); // prints "[5]"
我有一个很大的流管道,因此想保持它干净。我有以下部分更大的管道
Integer defaultInt;
//...
Stream<Integer> ints;
ints.filter(/* predicate_goes_here */).collect(toSingletonIfEmptyCollector);
其中 toSingletonIfEmptyCollector
如果 returns 非空列表和 Collections.singletonList(defaultInt)
如果 Collectors.toList()
返回空,则应该与 Collectors.toList()
相同。
是否有更短的方法来实现它(例如通过组合 JDK 中提供的标准收集器)而不是从头开始实现所有 Collector
的方法?
您可以使用 collectingAndThen
并在内置的 toList()
收集器上执行额外的整理操作,如果没有元素,它将 return 一个单例列表。
static <T> Collector<T, ?, List<T>> toList(T defaultValue) {
return Collectors.collectingAndThen(
Collectors.toList(),
l -> l.isEmpty() ? Collections.singletonList(defaultValue) : l
);
}
它会这样使用:
System.out.println(Stream.of(1, 2, 3).collect(toList(5))); // prints "[1, 2, 3]"
System.out.println(Stream.empty().collect(toList(5))); // prints "[5]"