Java 8新特性连载- optional用法详细-betway体育_betway88必威体育,必威国际必威官网

用过Java的童鞋应该有很深的领会,Java中经常会呈现NPE(NullPointException,空指针)反常,假如不处理好是一件十分头疼的工作,而为了处理NPE需求添加许多代码来防止,形成代码污染,有洁癖的童鞋Java 8新特性连载- optional用法具体-betway体育_betway88必威体育,必威世界必威官网可能会受不了哇。在Java8之前,这类人就喜爱用GJava 8新特性连载- optional用法具体-betway体育_betway88必威体育,必威世界必威官网oogle公司闻名的Guava库的Optional类来处理NPE问题,使咱们的Java代码更洁净,也许是遭到Guava启示,Java8也引入了Optional,连姓名都如出一辙。

一、引子

咱们先来看一段代码:

public String getGender(Cat cat) {
if(null == cat) {
return "不知道";
}
if(cat.getGender() == 0) {
return "公的";
}
return "母的";
}

能够看出,为了处理NPE咱们写了许多防御性的代码来防止。

二、Optional怎么高雅处理NPE

public String getGender(Cat cat) {
return Optional.ofNullable(cat).map(c -> c.getGender() == 0 ? "公的" : "母的").orElse("不知道");
}

简别董大古诗而洁、高雅有木有。

三、Optional的完成原理

经过检查Optional源码咱们能够看出,Optional的狗子函数是私有的,因而不能直接经过new 来创立Optional目标,它有三个静态办法:

public static  OptJava 8新特性连载- optional用法具体-betway体育_betway88必威体育,必威世界必威官网ional of(T value) {
return new Optional<>(value);
}

public static Optional ofNullable(T value) {
r巴旦木和杏仁的差异eturn value == null ? empty() : of(value);
}

public static Optional empty() {
@SuppressWarnings("unchecked")
Optional t = (Optional) EMPTY;
return t;
}

三个办法人工少女都好了解,唯一要多一句嘴的便是of和ofNullable的差异,从完成上能够冷孟梅知Java 8新特性连载- optional用法具体-betway体育_betway88必威体育,必威世界必威官网道,of标明Optional包括的目标是肯定不答应Java 8新特性连载- optional用法具体-betway体育_betway88必威体育,必威世界必威官网为空的,假如为空就会爆NPE,而ofNullable则表明答应为空,终究是不是空交给用户去处理。一般情况下ofNullable能够满意咱们绝大部分运用场景。那洁癖的童鞋该问了,有了ofNullable为啥还要of?按我的了解,我以为of的运用场景在于清晰有必要不为空的情况下,假如为空一定要爆NPE,例如咱们创立目标pineapple时能够这么写:

Op游览的含义tional.of(new 小张帝最新演唱会Cat());

这时,咱们就有必要确保new Cat()不为空,假如为空阐明内存溢出了,有必要立刻爆出反常告诉。

Optional还有几个办法做一下解说:

(1)get

public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}

当用Optional.get()时,若包括目标为空,将会抛出NoSucJava 8新特性连载- optional用法具体-betway体育_betway88必威体育,必威世界必威官网hElementException反常。

(2)isPresent

pub明星相片大全lic boolean isPresent() {
return value != null;
}

该办法仅仅做了次判空操作,我觉得在实践运用中是没有什么价值的,因为1080p它仅仅把判空操作封装成一个办法,仅此而已

(3)ifPresent

public void ifPresent(Consumer
if (value != null)
consumer.accept(value);
}

该办法承受一个函数式接口Consumer,Consumer与Function相似,仅仅Function有回来处理结果,而Consumer没有。因为ifPresent内部现已做过判空操作,因而咱们能够许美静酒店事情直接运用无需忧虑NPE问题。

(4)filter

public Optional filter(Predicate
Objects.requireNonNull(predicate);
if (!兴化isPresent())
return this;
else
return predicate.test(value) ? this : empty();
}

咱们能够经过filter办法对内容进行过滤,例如咱们能够过滤出猫龄大于5的猫

public static void filterAge(Cat cat)
{
OptiJava 8新特性连载- optional用法具体-betway体育_betway88必威体育,必威世界必威官网onal.ofNullable(cat).filter( c 撸死-> c.getAge() > 5).ifPresent(c -> System.out.println("The cat age is more欧美榜首 than 5."));
}

(5)map

public Optional map(Function
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}

map办法用于映射,即经过某种规矩将目标映射为别的一个目标,上面咱们写的getGender就用了map办法。

(6)orElse、orElseGet、orElseThrow

// 该办法答应Optional处理应内容为空时的代替值,或默认值
public T orElse(T other) 馆官能奇谭{截屏快捷键
return value != null ? value : other;
}
// 该办法答应经过一个Supplier函数接口回来一个其他值
p学生ublic T orElseGet(Supplier
return value != null ? value : other.get();
}
// 该办法是当为空时抛出反常
public T orElseThrow(Supplieropposite
if (value != null) {
return value;
} else {
throw excepti犯天斩煞的房子图onSupplier.get();
}
}

把握了Optional,咱们也能够写出简练高雅的Java代码。

评论(0)