java new 返回null_Java不同的方法来处理如果为null则为new

小编典典

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

例如,如果您有一个public JSONArray

getArray()始终要返回null以外的值的方法,则可以使用代码。使用Optional,它将变为:

public Optional 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

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

public abstract class Option implements Iterable {

private static final Option NONE = new None();

private Option() {

// no-op

}

public static Option of(T t) {

return t == null ? NONE : new Some(t);

}

public static Option empty() {

return NONE;

}

public abstract T get();

public abstract T orElse(T fallback);

public abstract T orElse(Supplier supplier);

public abstract T orThrow(Supplier exceptionSupplier) throws E;

public abstract boolean isPresent();

public abstract Option filter(Predicate predicate);

public abstract void ifPresent(Consumer consumer);

public abstract Option ifPresent(Function function);

private static final class Some extends Option {

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 supplier) {

return value;

}

@Override

public T orThrow(final Supplier exceptionSupplier) throws E {

return value;

}

@Override

public boolean isPresent() {

return true;

}

@Override

public Option filter(final Predicate predicate) {

return predicate.test(value) ? this

: NONE;

}

@Override

public void ifPresent(final Consumer consumer) {

consumer.consume(value);

}

@Override

public Option ifPresent(final Function function) {

return Option.of(function.apply(value));

}

@Override

public Iterator iterator() {

return Collections.singletonList(value).iterator();

}

}

private static final class None extends Option {

@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 supplier) {

return supplier.get();

}

@Override

public T orThrow(final Supplier exceptionSupplier) throws E {

throw exceptionSupplier.get();

}

@Override

public boolean isPresent() {

return false;

}

@Override

public Option filter(final Predicate predicate) {

return this;

}

@Override

public void ifPresent(final Consumer consumer) {

// no-op

}

@Override

public Option ifPresent(final Function function) {

return NONE;

}

@Override

public Iterator iterator() {

return Collections.emptyList().iterator();

}

}

}

2020-11-26

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值