Collector, возвращающий singletonList, если toList вернул пустой список

У меня довольно большой поток трубопровода, и поэтому я хотел бы сохранить его в чистоте. У меня есть следующая часть большего трубопровода

Integer defaultInt;
//...
Stream<Integer> ints;
ints.filter(/* predicate_goes_here */).collect(toSingletonIfEmptyCollector);

куда toSingletonIfEmptyCollector должен действовать так же, как Collectors.toList() делает, если он возвращает список не-emtpy и Collections.singletonList(defaultInt) если Collectors.toList() вернулся пустым.

Есть ли более короткий способ его реализации (например, путем составления стандартных сборщиков, представленных в JDK), а не реализации всех Collectorметод с нуля?

1 ответ

Решение

Ты можешь использовать collectingAndThen и выполнить дополнительную операцию финишера на встроенном toList() сборщик, который будет возвращать одноэлементный список, если не было элементов.

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]"
Другие вопросы по тегам