У меня есть этот код:


private Iterable<Practitioner> pickPractitioners(List<String> ids) {

    return Optional.ofNullable(ids)
        .map(List::stream)
        .orElse(Stream.of())
        .collect(
            Collectors.collectingAndThen(
                Collectors.toList(),
                this.practitionerRepository::findAllById
            )
        );

}

Проблема в том, что когда ids пусто, также выполняется this.practitionerRepository::findAllById.

Я бы хотел избежать этого шага, если результирующий коллектор пуст.

Любые идеи?

0
Jordi 4 Фев 2022 в 12:51

2 ответа

В общем, чтобы пропустить эту часть финишера, вы можете передать лямбду вместо ссылки на метод и проверить, пуст ли ввод:

    .collect(
        Collectors.collectingAndThen(
            Collectors.toList(),
            r -> r.isEmpty() ? Collections.emptyList() : this.practitionerRepository.findAllById(r)
        )
    );

Если ваш фактический код прост, как этот пример, вам вообще не нужно использовать потоки или необязательные элементы. Вместо этого вы можете просто проверить, является ли ввод метода нулевым или пустым в тернарном операторе:

    return ids == null || ids.isEmpty() ? Collections.emptyList() :
        this.practitionerRepository.findAllById(ids);
4
Alex - GlassEditor.com 4 Фев 2022 в 13:22

Если посмотреть на подпись Финишера. Это просто функция, поэтому вы можете просто написать ее:

public static<T,A,R,RR> Collector<T,A,RR> collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher) {
static interface MyRepository extends JpaRepository<Part, Long> {

}

public static void main(String[] args) {

    MyRepository myRepository = null;
    List<Long> list = null;

    Function<List<Long>, List<Part>> finisher = (ids) -> {

        return ids.isEmpty() ? Collections.emptyList() : myRepository.findAllById(ids);

    };

    Optional.ofNullable(list)
            .map(List::stream)
            .orElse(Stream.of())
            .collect(
                    Collectors.collectingAndThen(
                            Collectors.toList(),
                            finisher
                    )
            );

}
1
SMA 4 Фев 2022 в 13:16