Java 可选中的布尔谓词(保护)

Boolean Predicate (guard) in Java Optional

这是我的方法。

public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) {
    if (isInRoutesFile(element)) {
        return controllerName(element)
                .flatMap(name -> findController(element.getProject(), name))
                .map(controller -> new PsiReference[]{new RPsiElementReference(controller)})
                .orElse(new PsiReference[0]);
    }

    return new PsiReference[0];
}

现在,我想避免使用 if 子句,并以某种方式将谓词构建到 Optional 链中,以免重复 new PsiReference[0].

相比之下,Haskell 有一个功能 guard 正是为了这个目的。这是它的样子;

references :: Element -> Maybe [Reference]
references element = do
    guard $ isInRoutesFile element
    controllerName element >>= findController (getProject element) >>= Just . return . Reference

此代码将 return Nothing,如果 isInRoutesFile elementFalse,则相当于 Optional.empty()。 Java 拥有守卫的方法是什么?

filter

return Optional.of(element)
         .filter(this::isInRoutesFile)
         .flatMap(this::controllerName)
         .flatMap(name -> findController(element.getProjcet(), name))
         ...;