Получить ненулевое значение от объекта - PullRequest
0 голосов
/ 14 декабря 2018

Допустим, у меня есть класс Foo с X и X с Y. Я хочу получить Y из X, только если foo.getX() не null, в противном случае null, как показано ниже:

Y y = getNonNullValue(foo.getX(), X::getY);

Так что мне не нужно делать:

if (foo.getX() != null) {
    Y y = foo.getX().getY();
}

У меня есть следующий код

public <T, R> R getNonNullValue(final T t, final Supplier<R> supplier) {
    return ; // What to write here?
}

Имеет ли commons-lang или любая другая библиотека похожую функциональность?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Во-первых, неясно, что вы хотите, чтобы ваш метод getNonNullValue возвращал, когда foo.getX() возвращает null.Предполагая, что вы захотите, чтобы он возвратил null, вы можете просто сделать это:

public <T, R> R getNonNullValue(final T t, final Supplier<R> supplier) {
    return t != null ? supplier.get() : null;
}

Однако вы можете вызывать его только так, как пытаетесь, если getY является static методомв классе X:

// For this to work, X.getY() must be static
Y y = getNonNullValue(foo.getX(), X::getY);

Это, вероятно, не то, что вы хотите;Я думаю, что вы хотите вызвать не-static getY метод для объекта, который возвращает foo.getX().Если это так, то вам следует позвонить getNonNullValue следующим образом:

Y y = getNonNullValue(foo.getX(), foo.getX()::getY);

Я сомневаюсь, что это делает ваш код более понятным и лаконичным, чем просто написать следующее:

Y y = foo.getX() != null ? foo.getX().getY() : null;

К сожалению, в Java нет нуль-безопасного оператора разыменования, как в ряде других языков программирования, что сделало бы это более кратким и понятным.

0 голосов
/ 14 декабря 2018

Я не понял вашего вопроса, но я полагаю, что вам нужно это:

public <T, R> R getNonNullValue(final T t, final Function<T, R> mapper) {
    return Optional.ofNullable(t)
                    .map(mapper)
                    .orElse(null);
}

или как предложено Джеспером:

public <T, R> R getNonNullValue(final T t, final Supplier<R> supplier) {
        return t != null ? supplier.get() : null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...