Как реализовать оператор Elvis в Java 8?
у меня есть классический случай" оператора Элвиса", где я вызываю методы, которые каждый может возвращать null и связывать их вместе:
thing?:nullableMethod1(a)?:nullableMethod2(b)?:nullableMethod3()
в Java 8 самая верная реализация, которую я нашел, - это что-то вроде этого:
return Optional.ofNullable(thing)
.flatMap(x -> Optional.ofNullable(x.nullableMethod1(a)))
.flatMap(y -> Optional.ofNullable(y.nullableMethod2(b)))
.flatMap(z -> Optional.ofNullable(z.nullableMethod3()))
Я хочу, чтобы Java Optional
было что-то сродни оператору Элвиса:
public<U> Optional<U> elvisOperator(Function<? super T, ? extends U> mapper) {
return flatMap(t -> Optional.ofNullable(mapper.apply(t));
}
чтобы мне не пришлось обертывать каждое возвращаемое значение:
return Optional.ofNullable(thing)
.elvisOperator(x -> x.nullableMethod1(a))
.elvisOperator(y -> y.nullableMethod2(b))
.elvisOperator(Z::nullableMethod3); // also nice
есть ли более эффективный и идиоматический способ реализации шаблон оператора Элвиса в Java 8?
1 ответов
может быть, я что-то упускаю, но есть ли причина, по которой вы не можете использовать Optional#map
?
следующий пример ничего не печатает, как Optional
is короткое замыкание в том смысле, что, если значение внутри Optional
не существует (это null
или Optional
пусто), он рассматривается как пустой.
Optional.ofNullable("test")
.map(s -> null)
.ifPresent(System.out::println);
по этой причине, я думаю, вы могли бы просто сделать следующее:
return Optional.ofNullable(thing)
.map(x -> x.nullableMethod1(a))
.map(y -> y.nullableMethod2(b))
.map(Z::nullableMethod3);
Это карту thing
если он существует, или верните пустое Optional
иначе.