Установка значения String из одного поля объекта - PullRequest
1 голос
/ 08 апреля 2020

Как мне сделать мой код лучше?

Я хочу установить String Name в ob1j.getX (). GetXX (). GetName (), если он присутствует, в противном случае я бы установил name в obj1. .getY (). getYY (). getYYY (). GetName (). Я также использую Optional для выполнения нулевой проверки.

Это правильный способ сделать это?

Я использую JDK8, поэтому 'ifPresentOrElse' не вариант.

String Name = null;

Optional<String> optA = Optional.ofNullable(obj1.getX())
        .map(a -> a.getXX())
        .map(b -> b.getName())

if (optA.isPresent()) {
    name = optA.get();
} else {
    Optional<String> optB = Optional.ofNullable(obj1.getY())
        .map(a -> a.getYY())
        .map(b -> b.getYYY())
        .map(c -> c.getName())
    if (optB.isPresent()) {
        name = optB.get();
    }
}

1 Ответ

0 голосов
/ 08 апреля 2020

Вы можете сделать так:

name = Stream.of(
         Optional.ofNullable(obj1.getX()).map(X::getXX).map(XX::getName),
         Optional.ofNullable(obj1.getY()).map(Y::getYY).map(YY::getYYY).map(YYY::getName)
    )
     .filter(Optional::isPresent)
     .map(Optional::get)
     .findFirst().orElse(null);

Или для ленивой обработки вы используете Supplier вот так:

List<Supplier<Optional<String>>> suppliers =Arrays.asList(
            () -> Optional.ofNullable(obj1.getX()).map(X::getXX).map(XX::getName),
  () -> Optional.ofNullable(obj1.getY()).map(Y::getYY).map(YY::getYYY).map(YYY::getName));

name = suppliers.stream()
            .map(Supplier::get)
            .filter(Optional::isPresent)
            .map(Optional::get)
            .findFirst().orElse(null);
...