小编典典
您是否看过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