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

时间:2015-01-30 13:33:47

标签: haskell java-8 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

此代码将返回Nothing,如果Optional.empty()isInRoutesFile element,则相当于False。什么是Java的守卫方式?

1 个答案:

答案 0 :(得分:3)

它是filter

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

Haven还没有使用Java 8,所以我不确定你是否可以像这样传递函数,或者你需要特殊的函数引用语法,但你应该明白这一点。