代码之家  ›  专栏  ›  技术社区  ›  fastcodejava

从对象获取非空值

  •  -1
  • fastcodejava  · 技术社区  · 7 年前

    假设我有课 Foo 它有X,X有Y。 只有在 foo.getX() 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 回复  |  直到 7 年前
        1
  •  1
  •   Lho Ben    7 年前

    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;
    }
    
        2
  •  1
  •   Jesper    7 年前

    首先,不清楚你想要什么方法 getNonNullValue 何时返回 foo.getX() 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);
    

    那可能不是你想要的;我想你想称之为非- 静止的 格蒂 对象上的方法 返回。如果是这样的话,你应该打电话 getNonNullValue 这样地:

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

    我怀疑这是否使您的代码比直接编写以下内容更清晰和简洁:

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

    不幸的是,Java没有像许多其他编程语言那样的空安全的解引用运算符,这将使这一点更加简洁明了。