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 element
为 False
,则相当于 Optional.empty()
。 Java 拥有守卫的方法是什么?
是filter
。
return Optional.of(element)
.filter(this::isInRoutesFile)
.flatMap(this::controllerName)
.flatMap(name -> findController(element.getProjcet(), name))
...;
这是我的方法。
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 element
为 False
,则相当于 Optional.empty()
。 Java 拥有守卫的方法是什么?
是filter
。
return Optional.of(element)
.filter(this::isInRoutesFile)
.flatMap(this::controllerName)
.flatMap(name -> findController(element.getProjcet(), name))
...;