2015-08-09 3 views
3

У меня есть метод, который найдет оператора и вернет новую позицию.Возвращаемое значение по умолчанию в методе, если нет совпадений

public Integer findToken(Character operator) { 
    try { 
     return tokenList.stream() 
       .filter(x -> { 
        return x.position >= startPosition && 
          x.position <= endPosition && 
          x.operator == operator; 
       }) 
       .findFirst().get() 
       .position; 
    } catch (Exception ex) { 
     return null; 
    } 
} 

Но если совпадений нет, я хочу сохранить прежнее значение.

startPosition = findToken(Operator.value); 

Как вернуть прежнее значение? я попытался дать новый параметр со значением в методе и передать его в исключение, но тогда код выглядит уродливым. Есть ли способ лучше ?

+2

Нельзя использовать параметр Optional.get(), если вы не можете доказать, что существует совпадение (например, isPresent() уже вернул true). Вы должны использовать один из безопасных методов: orElse, orElseThrow, ifPresent и т. Д. Здесь вы можете просто отключить isPresent. –

ответ

4

Выполнение уступка таким образом, это не представляется возможным, если вы не передать старое значение в качестве параметра.

Что вы можете сделать, это изменить назначение использовать Optional, чтобы заботиться о null случае:

Optional.ofNullable(findToken('*')) 
     .ifPresent(pos -> startPosition = pos); 

Кроме того, было бы вероятность больше смысла использовать Optional, чтобы сделать его более явным, что метод findToken не может возвращать значение:

public Optional<Integer> findToken(Character operator) { 
    return tokenList.stream() 
      .filter(x -> 
       x.position >= startPosition && 
       x.position <= endPosition && 
       x.operator == operator 
      ) 
      .findFirst() 
      .map(t -> t.position); 
} 

В таком случае, назначение будет:

findToken('*').ifPresent(pos -> startPosition = pos); 
+0

Большое спасибо. Опционально решает проблему. –

3

Возможно, вы захотите использовать метод orElse().
Сохраните результат до findFirst во временной переменной, а затем выполните другие операции и возврат.
Для Instance

List<Integer> values = Arrays.asList(2, 4, 5, 6, 7, 1); 
    Integer i= values.stream() 
        .filter(x->x<1) 
        .findFirst().orElse(0); 

    System.out.println(i); 
Смежные вопросы