Коллектор, возвращающий singletonList, если toList вернул пустой список
у меня довольно большой трубопровод потока, и поэтому я хотел бы сохранить его в чистоте. У меня есть следующая часть большего трубопровода
Integer defaultInt;
//...
Stream<Integer> ints;
ints.filter(/* predicate_goes_here */).collect(toSingletonIfEmptyCollector);
здесь toSingletonIfEmptyCollector
должен действовать так же, как Collectors.toList()
делает, если он возвращает список non-emtpy и Collections.singletonList(defaultInt)
Если Collectors.toList()
возвращается пустой.
есть ли более короткий способ реализовать его (например, путем составления стандартных коллекторов, предусмотренных в JDK), а не реализации всех Collector
метод с нуля?
1 ответов
можно использовать collectingAndThen
и выполните дополнительную операцию финишера на встроенном toList()
collector, который вернет одноэлементный список в случае отсутствия элементов.
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]"