Java Необязательный orElse - PullRequest
4 голосов
/ 07 мая 2019

Как позвонить orElse, когда на одном из шагов map я получу пустой список?

MyObj myObj = new MyObj();
myObj.setAaa("aaa");
myObj.setBbb("bbb");
List<MyObj> myObjects = Arrays.asList(myObj);

Optional<List<MyObj>> opt = Optional.ofNullable(myObjects);

List<MyObj> result = opt
   //   .filter(el -> !returnEmptyList().isEmpty(el))
        .map(el -> returnEmptyList(el))
        .map(...)
        .map(...)
        .orElse(myObjects);

Как убедиться, что я достигну orElse, когда в моем mapstep результат - пустой список?

Подход с моим фильтром step работает, но я не хочу дважды вызывать returnEmptyList().

Ответы [ 2 ]

3 голосов
/ 07 мая 2019

Если операция map может вернуть пустой список, вы можете поместить filter перед orElse как:

.map() // this can return an empty list
.filter(l -> !l.isEmpty()) 
.orElse(<return some default value>); 

// if the list is empty, it would evaluate to Optional.empty() and return via orElse 
2 голосов
/ 07 мая 2019

У меня такое ощущение, что вы неправильно используете Optional, чтобы иметь что-то вроде свободного стиля программирования. ... Пожалуйста, не делай этого.

Неужели так сложно сделать следующее?

List<MyObj> myObjects = ...
List<MyObj> whatEverNeedsToBeCalculated = /* using myObjects... maybe extract to it's own function */

if (whatEverNeedsToBeCalculated.isEmpty())
  return myObjects;
else
  return whatEverNeedsToBeCalculated;

Назначается один раз, используется дважды; -)

И если это действительно ради беглости, я бы тогда предпочел использовать другой язык программирования на JVM; -)

...