从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException)
Optional<Object> empty = Optional.of(null);
//Exception in thread "main" java.lang.NullPointerException
Optional<Object> empty = Optional.empty();
//Exception in thread "main" java.util.NoSuchElementException: No value present
Optional<Object> empty = Optional.ofNullable(null);
//Exception in thread "main" java.util.NoSuchElementException: No value present
Object o = empty.get();
System.out.println(o);
下面通过几个小示例来说明基本用法
- 判断是否为null
String name = "fsdfds";
Optional<String> optional = Optional.ofNullable(name);
System.out.println(optional.isPresent());//判断是否不为null 不为空ture
System.out.println(optional.get()); //fsdfds
- 通过ifpresent判断是否执行
String name = "fsdfds";
Optional<String> optional = Optional.ofNullable(name);//如果不为null 才会执行下面操作
optional.ifPresent(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
- orElse来设置默认值(如果是空则是默认值,如果不为空是设置值)
String s1 = null;
String s2 = "sss";
String ss = Optional.ofNullable(s1).orElse(s2);
System.out.println(ss);//sss
- 表面看来和orElse是一样的,其实内部实现是不同的,orelse 每次都创建,而orelseGet只创建一次
String s1 = null;
String s2 = "sss";
String ss = Optional.ofNullable(s1).orElseGet(new Supplier<String>() {
@Override
public String get() {
return "www";
}
});
System.out.println(ss);
- map 转化
String s = "sss";
Optional<String> ss = Optional.ofNullable(s).map(new Function<String, String>() {
@Override
public String apply(String s) {
return s+"123";
}
});
System.out.println(ss.get()); // sss123
- flatMap转化
String s = "sss";
Optional<String> ss = Optional.ofNullable(s).flatMap(new Function<String, Optional<String>>() {
@Override
public Optional<String> apply(String s) {
return Optional.ofNullable(s+"123");
}
});
System.out.println(ss.get()); // sss123
- filter过滤
String s = "sss";
Optional<String> ss = Optional.ofNullable(s).filter(new Predicate<String>() {
@Override
public boolean test(String s) {
return true; //true 有值 false 无值
}
});
System.out.println(ss.get());
总结:(因为笔者在学习optionnal之前用过rxjava和spark,所以对这种链式调用以及map,flatmap 这个并不陌生,如果你相对比较陌生,请阅读其他文档
)
- Optional 是 Java 语言的有益补充 —— 它旨在减少代码中的NullPointerExceptions,虽然还不能完全消除这些异常。
- 它也是精心设计,自然融入 Java 8 函数式支持的功能。
- 总的来说,这个简单而强大的类有助于创建简单、可读性更强、比对应程序错误更少的程序。
网友评论