Java 8 - возвращение пустого необязательного - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть этот метод, который я хочу вернуть пустой необязательный ничего не найдено

@Override
public Optional<Menu> findBySymbol (String symbol) {
    Optional<Menu> menu = 
                    StreamSupport
                    .stream(cachedMenus.get(ALL_CURRENCIES_KEY).spliterator(), true)
                    .findFirst();

    return menu.orElse(Optional.empty());

}

но я получил ошибку компиляции: Type mismatch: cannot convert from Optional<Object> to Menu

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

почему бы просто не вернуть его?

return StreamSupport.stream(cachedMenus.get(ALL_CURRENCIES_KEY).spliterator(), true)
                     .findFirst();
0 голосов
/ 03 декабря 2018

Optional.orElse(T other) возвращает значение, если оно присутствует, в противном случае параметр возвращается как значение.
Таким образом, компилятор ожидает в качестве типа параметра переменную того же типа, что и обобщенный тип, используемый для Optional.Здесь у вас есть Optional<Menu>, поэтому ожидается Menu.
Принимая во внимание ошибку компиляции здесь:

return menu.orElse(Optional.empty());

Обратите внимание, что главная цель Optional - это действительно обернуть значение, есливыходит или обернуть пустой (вместо null).
Таким образом, чтобы получить пустой необязательный элемент из потоковой обработки, такой как findFirst() или findAny(), вам не нужно ничего делать.
Так какдругие говорили, что этого достаточно:

return  StreamSupport
        .stream(cachedMenus.get(ALL_CURRENCIES_KEY).spliterator(), true)
        .findFirst();
0 голосов
/ 03 декабря 2018

просто вернуть:

return StreamSupport.stream(cachedMenus.get(ALL_CURRENCIES_KEY).spliterator(), true)
                    .findFirst();

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

...