这是我的方法。
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的守卫方式?
答案 0 :(得分:3)
它是filter
。
return Optional.of(element)
.filter(isInRoutesFile)
.flatMap(controllerName)
.flatMap(name -> findController(element.getProjcet(), name))
...;
Haven还没有使用Java 8,所以我不确定你是否可以像这样传递函数,或者你需要特殊的函数引用语法,但你应该明白这一点。