持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
Optional
Optional是Java8中引入解决NullPointerException的类,它是一个容器对象,可以存储对象、字符串等值,当然也可以存储 null 值。Optional提供了很多方法帮助我们使用少量代码完成复杂的流程。
of
给为非null的值创建一个Optional。它通过工厂方法创建Optional实例,在创建的时候,不能传入null值,会抛出NullPointerException。
Optional<String> optional = Optional.of("not null");
//传入null会抛出异常
Optional<String> error = Optional.of(null);
ofNullable
与of()方法类似,区别是ofNullable()可以接受一个null作为参数,如果指定参数为null,则会返回一个空的Optional。
Optional<String> empty = Optional.ofNullable(null);
System.out.println(empty.isEmpty());//true
isPresent
isPresent方法用来检查Optional实例中是否包含值。
Optional<String> empty = Optional.ofNullable(null);
System.out.println(empty.isPresent());//false
get
获取Optional中的值,如果没有值,会抛出NoSuchElementException: No value present
异常。
Optional<String> empty = Optional.ofNullable(null);
System.out.println(empty.get());//No value present
ifPresent
如果Optional实例有值则为其调用consumer,否则不做处理
public void ifPresent(Consumer<? super T> action) {
if (value != null) {
action.accept(value);
}
}
orElse
如果有值存在就直接返回, 否则返回指定的其它值。
Optional<String> empty = Optional.ofNullable(null);
System.out.println(empty.orElse("empty"));
orElseGet
和orElse类似,如果有值存在就直接返回, 否则返回指定的其它值。不同的是orElseGet接受一个Supplier<? extends T> supplier
用来生成默认值。
Optional<String> empty = Optional.ofNullable(null);
System.out.println(empty.orElseGet(() -> "create by Supplier"));
map
如果有值,则对其执行调用mapping函数得到返回值。
public <U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent()) {
return empty();
} else {
return Optional.ofNullable(mapper.apply(value));
}
}
如果存在值,map方法执行传入的lambda表达式参数对Optional实例的值进行修改。否则直接返回空Optional。
flatMap
flatMap方法与map方法类似,区别在于mapping函数的返回值不同。map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Optional。
public <U> Optional<U> flatMap(Function<? super T, ? extends Optional<? extends U>> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent()) {
return empty();
} else {
@SuppressWarnings("unchecked")
Optional<U> r = (Optional<U>) mapper.apply(value);
return Objects.requireNonNull(r);
}
}
filter
根据传入的条件参数对Optional实例的值进行过滤。
Optional<Integer> age = Optional.of(10);
Optional<Integer> integer = age.filter(s -> s < 18);
System.out.println(integer);
如果满足条件返回包含该值的Optional,否则返回空Optional。
public Optional<T> filter(Predicate<? super T> predicate) {
Objects.requireNonNull(predicate);
if (!isPresent()) {
return this;
} else {
return predicate.test(value) ? this : empty();
}
}