2015-01-30 4 views
1

Вот мой метод.Булевский предикат (охрана) в Java Дополнительно

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 иметь страж?

ответ

3

Это filter.

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

Не использовал Java 8, что многое еще, так что я не уверен, если вы можете передать функции так же, как это, или вам нужен специальный ссылочную функции синтаксис, но вы должны получить идею.

+0

Исходный синтаксис: this this is isInRoutesFile. –

Смежные вопросы