62
задан 12 August 2015 в 18:25

10 ответов

С Java 9 или выше, ifPresentOrElse наиболее вероятно, что Вы хотите:

Optional<> opt = dao.find();

opt.ifPresentOrElse(obj -> obj.setAvailable(true),
                    () -> logger.error("…"));

Приправляющее карри использование vavr или одинаково мог бы получить еще более опрятный код, но я еще не попробовал.

95
ответ дан 31 October 2019 в 13:27

Я не думаю, что можно сделать это в отдельном операторе. Лучше сделайте:

if (!obj.isPresent()) {
    logger.fatal(...);   
} else {
    obj.get().setAvailable(true);
}
return obj;
34
ответ дан 31 October 2019 в 13:27

Необходимо будет разделить это на несколько операторов. Вот один способ сделать это:

if (!obj.isPresent()) {
  logger.fatal("Object not available");
}

obj.ifPresent(o -> o.setAvailable(true));
return obj;

Иначе (возможно сверхспроектированный) должен использовать map:

if (!obj.isPresent()) {
  logger.fatal("Object not available");
}

return obj.map(o -> {o.setAvailable(true); return o;});

, Если obj.setAvailable удобно возвраты obj, то Вы можете просто второй пример к:

if (!obj.isPresent()) {
  logger.fatal("Object not available");
}

return obj.map(o -> o.setAvailable(true));
10
ответ дан 31 October 2019 в 13:27

В первую очередь, Ваш dao.find() должен или возвратиться Optional<Obj>, или необходимо будет создать тот.

, например,

Optional<Obj> = dao.find();

или можно сделать это сами как:

Optional<Obj> = Optional.ofNullable(dao.find());

этот возвратится Optional<Obj> если существующий или Optional.empty() если не существующий.

Поэтому теперь позволяют нам добраться до решения,

public Obj getObjectFromDB() {
   return Optional.ofNullable(dao.find()).flatMap(ob -> {
            ob.setAvailable(true);
            return Optional.of(ob);    
        }).orElseGet(() -> {
            logger.fatal("Object not available");
            return null;
        });
    }

Это - один лайнер, который Вы ищете :)

9
ответ дан 31 October 2019 в 13:27

Для предложений Java 8 Spring ifPresentOrElse от "Служебных методов работать с Optionals" для достижения того, что Вы хотите. Пример был бы:

import static org.springframework.data.util.Optionals.ifPresentOrElse;    

ifPresentOrElse(dao.find(), obj -> obj.setAvailable(true), () -> logger.fatal("Object not available"));
9
ответ дан 31 October 2019 в 13:27

Там .orElseRun метод, но это называют .orElseGet, проблема состоит в том, что, в отличие от этого .map, .isPresent не возвращается Optional<Obj>.

, Если Вы действительно хотите сделать это в одном операторе, это возможно:

public Obj getObjectFromDB() {
    return dao.find()
        .map( obj -> { 
            obj.setAvailable(true);
            return Optional.of(obj); 
         })
        .orElseGet( () -> {
            logger.fatal("Object not available"); 
            return Optional.empty();
    });
}

, Но это еще более неуклюже, чем, что Вы имели прежде.

6
ответ дан 31 October 2019 в 13:27

Я смог, придумал несколько "одну строк" решения, например:

    obj.map(o -> (Runnable) () -> o.setAvailable(true))
       .orElse(() -> logger.fatal("Object not available"))
       .run();

или

    obj.map(o -> (Consumer<Object>) c -> o.setAvailable(true))
       .orElse(o -> logger.fatal("Object not available"))
       .accept(null);

или

    obj.map(o -> (Supplier<Object>) () -> {
            o.setAvailable(true);
            return null;
    }).orElse(() () -> {
            logger.fatal("Object not available")
            return null;
    }).get();

Это не выглядит очень хорошим, что-то как orElseRun было бы намного лучше, но я думаю, что опция с Выполнимым приемлема, если Вы действительно хотите одно решение для строки.

1
ответ дан 31 October 2019 в 13:27

Вам нужно Optional.isPresent () и orElse () . Ваш отрывок выигран; t работают, потому что это ничего не возвращает если не существующий.

точка Дополнительных должна возвратить его из метода.

0
ответ дан 31 October 2019 в 13:27

С Java 8 Optional это может быть, покончите:

    Optional<Obj> obj = dao.find();

    obj.map(obj.setAvailable(true)).orElseGet(() -> {
        logger.fatal("Object not available");
        return null;
    });
0
ответ дан 31 October 2019 в 13:27

Я предполагаю, что Вы не можете измениться dao.find() метод для возврата экземпляра Optional<Obj>, таким образом, необходимо создать соответствующий сами.

следующий код должен выручить Вас. Я имею, создают класс OptionalAction, который обеспечивает если еще механизм для Вас.

public class OptionalTest
{
  public static Optional<DbObject> getObjectFromDb()
  {
    // doa.find()
    DbObject v = find();

    // create appropriate Optional
    Optional<DbObject> object = Optional.ofNullable(v);

    // @formatter:off
    OptionalAction.
    ifPresent(object)
    .then(o -> o.setAvailable(true))
    .elseDo(o -> System.out.println("Fatal! Object not available!"));
    // @formatter:on
    return object;
  }

  public static void main(String[] args)
  {
    Optional<DbObject> object = getObjectFromDb();
    if (object.isPresent())
      System.out.println(object.get());
    else
      System.out.println("There is no object!");
  }

  // find may return null
  public static DbObject find()
  {
    return (Math.random() > 0.5) ? null : new DbObject();
  }

  static class DbObject
  {
    private boolean available = false;

    public boolean isAvailable()
    {
      return available;
    }

    public void setAvailable(boolean available)
    {
      this.available = available;
    }

    @Override
    public String toString()
    {
      return "DbObject [available=" + available + "]";
    }
  }

  static class OptionalAction
  {
    public static <T> IfAction<T> ifPresent(Optional<T> optional)
    {
      return new IfAction<>(optional);
    }

    private static class IfAction<T>
    {
      private final Optional<T> optional;

      public IfAction(Optional<T> optional)
      {
        this.optional = optional;
      }

      public ElseAction<T> then(Consumer<? super T> consumer)
      {
        if (optional.isPresent())
          consumer.accept(optional.get());
        return new ElseAction<>(optional);
      }
    }

    private static class ElseAction<T>
    {
      private final Optional<T> optional;

      public ElseAction(Optional<T> optional)
      {
        this.optional = optional;
      }

      public void elseDo(Consumer<? super T> consumer)
      {
        if (!optional.isPresent())
          consumer.accept(null);
      }
    }
  }
}
-2
ответ дан 31 October 2019 в 13:27

Другие вопросы по тегам:

Похожие вопросы: