当前位置: 首页 > 面试题库 >

Java不同的方法来处理如果为null则为new

芮岳
2023-03-14
问题内容

好的,我有一个有关处理null的问题。这个问题可能主要基于观点,因此我要问一下优缺点。

假设我有一个可以返回null或JSONArray的函数。我一直想要一个JSONArray,因此如果函数的结果为null,我希望它创建一个空的JSONArray。

目前,我有以下方法:

jsonArray = jsonArray==null?new JSONArray():jsonArray;

我喜欢这种方法,因为它只是一行,而且很清楚它的作用。但这确实引出我一个问题,这有效吗?我有一个想法,现在它可以jsonArray = jsonArray在不需要时执行。尽管这样做确实可以节省一跳,if (jsonArray == null)

不同方式处理null的优点是什么?


问题答案:

您是否看过Java 8的Optional课程?这是一个对象包装器,可让您以功能性方式处理null。

例如,如果您有一个public JSONArray getArray()始终要返回null以外的值的方法,则可以使用代码。使用Optional,它将变为:

public Optional<JSONArray> getArray() {
    // jsonArray comes from somewhere
    return Optional.ofNullable(jsonArray);
}

如果jsonArray为null,则可选参数为空;否则为null。在不为null的情况下,它将包含jsonArray。

然后,您可以将空检查替换为可选命令规定的行为。代替

JSONArray array = getArray();
if (array != null) {
    // do something
}

您将其替换为

getArray().ifPresent(array -> // do something);

这意味着您不需要创建空的JSONArrays,列表,集合,字符串或任何其他内容。如果包装的对象实际上为null,则从中返回singleton
Optional Optional.ofNullable,从而进一步减少了开销。

如果您仍然想采用经典方法,那也是可能的。由于if (option == null)应该始终求值为false(如果您返回null而不是Optional,那么您可能会遗漏要点!),您将使用if (option.isPresent())

如果您未使用Java 8,则可以编写自己的Optional或使用第三方库(例如Guava)。

编辑:非Java 8解决方案

解决方案1

使用类似番石榴的东西-看一下http://docs.guava-
libraries.googlecode.com/git/javadoc/com/google/common/base/Optional.html

解决方案2

自己写!在此实现中SupplierConsumerPredicate是返回,接受或测试对象的接口。

public abstract class Option<T> implements Iterable<T> {

    private static final Option NONE = new None();

    private Option() {
        // no-op
    }

    public static <T> Option<T> of(T t) {
        return t == null ? NONE : new Some<T>(t);
    }

    public static <T> Option<T> empty() {
        return NONE;
    }

    public abstract T get();

    public abstract T orElse(T fallback);

    public abstract T orElse(Supplier<T> supplier);

    public abstract <E extends Exception> T orThrow(Supplier<E> exceptionSupplier) throws E;

    public abstract boolean isPresent();

    public abstract Option<T> filter(Predicate<T> predicate);

    public abstract void ifPresent(Consumer<T> consumer);

    public abstract <O> Option<O> ifPresent(Function<T, O> function);

    private static final class Some<T> extends Option<T> {

        private final T value;

        private Some(final T value) {
            this.value = value;
        }

        @Override
        public T get() {
            return value;
        }

        @Override
        public T orElse(final T fallback) {
            return value;
        }

        @Override
        public T orElse(final Supplier<T> supplier) {
            return value;
        }

        @Override
        public <E extends Exception> T orThrow(final Supplier<E> exceptionSupplier) throws E {
            return value;
        }

        @Override
        public boolean isPresent() {
            return true;
        }

        @Override
        public Option<T> filter(final Predicate<T> predicate) {
            return predicate.test(value) ? this
                                         : NONE;
        }

        @Override
        public void ifPresent(final Consumer<T> consumer) {
            consumer.consume(value);
        }

        @Override
        public <O> Option<O> ifPresent(final Function<T, O> function) {
            return Option.of(function.apply(value));
        }

        @Override
        public Iterator<T> iterator() {
            return Collections.singletonList(value).iterator();
        }
    }

    private static final class None<T> extends Option<T> {
        @Override
        public T get() {
            throw new IllegalStateException("value not defined");
        }

        @Override
        public T orElse(final T fallback) {
            return fallback;
        }

        @Override
        public T orElse(final Supplier<T> supplier) {
            return supplier.get();
        }

        @Override
        public <E extends Exception> T orThrow(final Supplier<E> exceptionSupplier) throws E {
            throw exceptionSupplier.get();
        }

        @Override
        public boolean isPresent() {
            return false;
        }

        @Override
        public Option<T> filter(final Predicate<T> predicate) {
            return this;
        }

        @Override
        public void ifPresent(final Consumer<T> consumer) {
            // no-op
        }

        @Override
        public <O> Option<O> ifPresent(final Function<T, O> function) {
            return NONE;
        }

        @Override
        public Iterator<T> iterator() {
            return Collections.<T>emptyList().iterator();
        }
    }
}


 类似资料:
  • 问题内容: 我有一个表,其中有一个带有默认值的列: 有一个存储过程插入到: 您可以看到,我必须有条件地分支以便我的插入使用默认值(如果为null)。仅一列就可以了,但是请考虑是否有更多列-语法可能很笨拙。 我是否可以使用一种语法来指定插入值应该返回默认值(如果为null)?我尝试了以下操作,但可以理解的是语法错误: 问题答案:

  • 问题内容: 是否可以将此代码转换为Java 8可选单行表达式? 即如果某个对象不为空,我需要调用一个对象方法并返回其结果,否则返回0。 不适合,因为它返回相同类型的对象,但是我需要方法调用的结果或一些默认值。 问题答案: 几种形式: 其中,最后一个不使用Optional(因此不能严格回答您的问题!)更易于阅读,运行时开销也较小,因此应优先使用。 可以说,如果您反转选项,它甚至更简单: …尽管您可能

  • 是否可以将此代码转换为Java8可选的单行表达式? i、 如果某个对象不是null,我需要调用一个对象方法并返回其结果,否则返回0<代码>可选。不可数()。orElse()不适合,因为它返回相同类型的对象,但我需要方法调用的结果或一些默认值。

  • 我已经连接表与一个 新娘模型: 计划模型: 我有一个查询将这些数据返回到endpoint。 一切都很好,除了一件事。在婚宴桌上,一些身份证上没有计划。因此,当我返回数据时,一些带有一个空的数组。 我想阻止这种情况。如果没有计划,那么我不想返回该新娘id。在这里我如何才能实现我想要的?

  • 这看起来有点奇怪,因为orElse方法使用的变量不在lambda的范围内。我能知道最好的方法吗? 也许我应该说说为什么我选择了可选的。我希望我的团队的开发人员明白,即使字符串A是首选的,它可能是空的,并且必须处理,因为代码的这一部分是敏感的。字符串B仅用于记录的遗留部分。希望这能澄清我对这种方法的意图。

  • 问题内容: 我有以下映射 我如何配置我的Mapper或Mappings,以便当childId为null时,将目标Entity.child设置为null而不是Entity.child.id? 问题答案: 对于我来说,找到的不是一个非常优雅的解决方案,而是可行的解决方案。 首先将接口更改为抽象类,然后添加