С Java 9 или выше, ifPresentOrElse
наиболее вероятно, что Вы хотите:
Optional<> opt = dao.find();
opt.ifPresentOrElse(obj -> obj.setAvailable(true),
() -> logger.error("…"));
Приправляющее карри использование vavr или одинаково мог бы получить еще более опрятный код, но я еще не попробовал.
Я не думаю, что можно сделать это в отдельном операторе. Лучше сделайте:
if (!obj.isPresent()) {
logger.fatal(...);
} else {
obj.get().setAvailable(true);
}
return obj;
Необходимо будет разделить это на несколько операторов. Вот один способ сделать это:
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));
В первую очередь, Ваш 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;
});
}
Это - один лайнер, который Вы ищете :)
Для предложений 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"));
Там .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();
});
}
, Но это еще более неуклюже, чем, что Вы имели прежде.
Я смог, придумал несколько "одну строк" решения, например:
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
было бы намного лучше, но я думаю, что опция с Выполнимым приемлема, если Вы действительно хотите одно решение для строки.
Вам нужно Optional.isPresent () и orElse () . Ваш отрывок выигран; t работают, потому что это ничего не возвращает если не существующий.
точка Дополнительных должна возвратить его из метода.
С Java 8 Optional
это может быть, покончите:
Optional<Obj> obj = dao.find();
obj.map(obj.setAvailable(true)).orElseGet(() -> {
logger.fatal("Object not available");
return null;
});
Я предполагаю, что Вы не можете измениться 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);
}
}
}
}