Java Optionals: верните значение или сделайте что-нибудь и продолжите цикл - PullRequest
0 голосов
/ 31 мая 2019

В цикле у меня есть код, подобный этому

    for (Id id : ids) {
        Item item = itemRepo.findbyId(id);

        if(item == null) {
            Log.error("No item by id");
            continue;
        }

        // bla bla bla
    }

Каков наилучший способ переписать это, используя Optionals?

Я пытался переписать и хотел использовать ifPresentOrElse, чтобы сделать код короче, но для метода ifPresentOrElse () написано

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

Следовательно, я просто не могу вернуть значение, если оно там есть. Есть предложения?

Спасибо.

ОБНОВЛЕНИЕ: я сожалею, забыл упомянуть, что мне нужно решение с необязательным, так как функция репозитория getById изменилась, и он возвращает Необязательный как результат.

Ответы [ 4 ]

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

Я не думаю, что Optional здесь нужен, просто else работает

for (Id id : ids) {
    Item item = itemRepo.findbyId(id);

    if(item == null) {
        Log.error("No item by id");
    } else {
        // bla bla bla
    }
}
1 голос
/ 31 мая 2019

Я тоже не большой поклонник Факультативного. Но на тот случай, если вы захотите его использовать, это может сработать:

List<Id> ids = new ArrayList<Id>();
for (Id id : ids) {
    Optional.ofNullable(itemRepo.findbyId(id))
        .ifPresentOrElse(i -> process(i),
            () -> Log.error("No item by id"));
}

На мой взгляд, необязательные параметры должны использоваться вместе с потоками. Цикл for - отличный кандидат для потока.

ids.stream()
    .map(itemRepo::findbyId)
    .map(Optional::ofNullable)
    .forEach(o -> o.ifPresentOrElse(i -> process(i), 
            () -> Log.error("No item by id")));
0 голосов
/ 31 мая 2019

Хорошим вариантом использования Optional является написание аккуратного кода, избегая ненужных проверок нуля. Так что здесь в вашем коде есть одно место, где можно использовать Optional -

for (Id id : ids) {
    Item item = itemRepo.findbyId(id);

    Item item_notNull = Optional.ofNullable(item).orElse(<deafult instance of Item>);
    // now do anything with item_notNull, it'll never be null
    // bla bla bla
}

Ограничением вышеприведенного кода является то, что вы не получаете уведомление, если Элемент имеет значение null. Если вы хотите, вы можете использовать код ниже

for (Id id : ids) {
    Optional<Item> item = Optional.ofNullable(Repo.findbyId(id));


    if (item.isPresent()) {
            System.out.println("No item by id");
            continue;
        }else{
            //do something
        }


    // bla bla bla
}
0 голосов
/ 31 мая 2019
for (Id id : ids) {
    Optional<Item> item = Optional.ofNullable(itemRepo.findbyId(id));

    item.ifPresentOrElse(()->System.out.println(item.get()), this::logNoItem());

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...