乐趣区

Java8新特性之Optional

上一篇小乐带大家了解了 Java8 新特性之 Stream,接下来将会继续述说 Java 新特性之 Optional

Optional<T> 类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
1、of
为非 null 的值创建一个 Optional,如果值为 null, 则会抛出 NullPointerException
Optional<Integer> optional = Optional.of(13);
System.out.println(optional)

2、ofNullable
为指定的值创建一个 Optional,如果指定的值为 null,则返回一个空的 Optional。
Optional<String> optional2 = Optional.ofNullable(null);
System.out.println(optional2);
optional2 = Optional.ofNullable(“aaa”);
System.out.println(optional2);

3、isPresent
如果值存在返回 true,否则返回 false。
Optional<String> optional2 = Optional.ofNullable(null);
System.out.println(optional2);
System.out.println(optional2.isPresent());

optional2 = Optional.ofNullable(“aaa”);
System.out.println(optional2);
System.out.println(optional2.isPresent());

4、get
如果 Optional 有值则将其返回,否则抛出 NoSuchElementException。
optional2 = Optional.ofNullable(“aaa”);
System.out.println(optional2);
System.out.println(optional2.isPresent());
System.out.println(optional2.get());

5、ifPresent

如果 Optional 实例有值则为其调用 consumer,否则不做处理。隐士地其中进行了 null 判断。
public static void main(String[] args) {
String str1 = “hello”;
String str2 = null;
Optional<String> optional1 = Optional.ofNullable(str1);
Optional<String> optional2 = Optional.ofNullable(str2);

optional1.ifPresent(str->System.out.println(str.length()));
optional2.ifPresent(str-> System.out.println(str.length()));
}

6、orElse
如果有值则将其返回,否则返回指定的其它值。
public static void main(String[] args) {
String str1 = “hello”;
String str2 = null;
Optional<String> optional1 = Optional.ofNullable(str1);
Optional<String> optional2 = Optional.ofNullable(str2);
System.out.println(optional1.orElse(“ 默认字符串 ”));
System.out.println(optional2.orElse(“ 默认字符串 ”));
}

7、orElseGet
orElseGet 与 orElse 方法类似,区别在于得到的默认值。orElse 方法将传入的一个值作为默认值,orElseGet 方法可以接受 Supplier 接口的实现用来生成默认值
public static void main(String[] args) {
Integer i = 20;
Optional<Integer> op = Optional.ofNullable(i);
System.out.println(op.orElseGet(()->0));
System.out.println(Optional.ofNullable(null).orElseGet(()->0));
}

8、orElseThrow
如果有值则将其返回,否则抛出 supplier 接口创建的异常。
public static void main(String[] args) {
// 自己指定异常
System.out.println((Optional.ofNullable(“a”).orElseThrow(()->new IndexOutOfBoundsException())));
System.out.println((Optional.ofNullable(null).orElseThrow(()->new IndexOutOfBoundsException())));
}

9、map
map 处理有值的情况,如果有值,则对其执行调用 map 参数中的函数得到返回值,否则返回空 Optional。
public static void main(String[] args) {
List<String> list = new ArrayList<String>(){
{
add(“aaa”);
add(“bbb”);
add(null);
}
};

list.stream().forEach(temp ->{
Optional<String> opt = Optional.ofNullable(temp);
System.out.println(opt.map(n -> {
return n.toUpperCase();
}).orElse(“Nothing”));
});

// 简写为如下形式
list.stream().forEach(temp->{
System.out.println(Optional.ofNullable(temp).map(n->n.toUpperCase()).orElse(“Nothing”));
});
}

10、flatMap
如果有值,为其执行 mapping 函数返回 Optional 类型返回值,否则返回空 Optional。flatMap 与 map(Funtion)方法类似,区别在于 flatMap 中的 mapper 返回值必须是 Optional。调用结束时,flatMap 不会对结果用 Optional 封装。可以将内容
public static void main(String[] args) {
Optional<String> opt1 = Optional.ofNullable(“aaa”);
Optional<String> opt2 = Optional.ofNullable(null);
System.out.println(opt1.flatMap(n->{
return Optional.ofNullable(n.toUpperCase());
}).orElse(“ 还会没有吗 ”));

System.out.println(opt2.flatMap(n->{
return Optional.ofNullable(n.toUpperCase());
}).orElse(“ 还会没有吗 ”));
}

11、filter
如果有值并且满足断言条件返回包含该值的 Optional,否则返回空 Optional。
public static void main(String[] args) {
Optional<String> opt1 = Optional.ofNullable(“aabbbbaa”);
Optional<String> opt2 = Optional.ofNullable(null);

System.out.println(opt1.filter(value->value.length()>6));
System.out.println(opt2.filter(value->value.length()>6));
}

好了,Java8 新特性之 Optional 就介绍到这里了,接下去小乐将会继续带大家了解 Java8 新特性,请继续关注,转载请说明出处和作者。

退出移动版