Java 流;避免 Collectors.collectingAndThen 上的完成程序

Jor*_*rdi 1 java java-stream

我有这个代码:


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
            )
        );

}
Run Code Online (Sandbox Code Playgroud)

问题是当ids为空时,this.practitionerRepository::findAllById也会被执行。

如果生成的收集器为空,我想避免此步骤。

有任何想法吗?

Ale*_*lex 6

一般来说,要跳过终结器的这一部分,您可以传递 lambda 而不是方法引用,并检查输入是否为空:

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

如果您的实际代码像本示例一样简单,那么您根本不需要使用流或可选。相反,您可以只检查三元运算符中方法的输入是否为 null 或为空:

    return ids == null || ids.isEmpty() ? Collections.emptyList() :
        this.practitionerRepository.findAllById(ids);
Run Code Online (Sandbox Code Playgroud)