程序猿要与时俱进!JDK11都出来了你还要守着jdk6和7?当你认为JDK8有BUG的时候你可曾知道当初JDK6、JDK7也是这样过来的!
最近我要批评一些人了!在我遇到的一些菜鸟当中,问他会不会JDK8中的Optional?他说不会!我说你为什么不学!他说以后再,JDK8现在用的企业不是很多,还可能存在一些未知的BUG!
我当场就想要骂人了,你活该做菜鸟!
回归主题,我希望关注我的还不会 Optional 的网友,通过这篇文章可以教育你的同事!
每个接触 JAVA 的程序员可能都遇到过 NPE(NullPointerException) 问题。JDK8 为了帮助我们很好的避免了这一现象,推出了 Optiona 功能,它是一个新特性。我们一起来看看它的相关用法!
of/empty/ofNullable
Xttblog xttblog = null;// xttblog 是一个 空对象 /** * 源码: * public static <T> Optional<T> of(T value) {//of会创建一个 实例化一个 Optional * return new Optional<>(value); * } * private Optional(T value) { //检查value是否为null * this.value = Objects.requireNonNull(value); * } * public static <T> T requireNonNull(T obj) { //不做解释了... * if (obj == null) * throw new NullPointerException(); * return obj; * } * 解释: 如果对象为Null使用of会抛出java.lang.NullPointerException */ Optional<Xttblog> op1 = Optional.of(xttblog); Optional<Xttblog> op2 = Optional.empty();//看API就知道啥意思了,基本没什么太大卵用 /** * 源码: * public static <T> Optional<T> ofNullable(T value) { * return value == null ? empty() : of(value); * } * 解释: 如果对象为空就返回 empty() 相反就 调用 of(value); */ Optional<Xttblog> op3 = Optional.ofNullable(xttblog);
get/isPresent
Optional<Xttblog> op = Optional.ofNullable(null);//创建一个对象为Null的Optional /** * 源码: * public boolean isPresent() { * return value != null; * } * 解释: 因为 value == null 源码是 value != null 因此返回false */ System.out.println(op.isPresent()); /** * 源码: * public T get() { * if (value == null) { * throw new NoSuchElementException("No value present"); * } * return value; * } * 解释: 如果 value 为空 null 抛出 NoSuchElementException 否则返回 T */ System.out.println(op.get());
orElse/orElseGet/orElseThrow
Xttblog xttblog = null; /** * 源码: * public T orElseGet(Supplier<? extends T> other) { * return value != null ? value : other.get(); * } * 解释: 对象为空返回null,否则返回对象 */ Xttblog s1 = Optional.ofNullable(xttblog).orElseGet(Xttblog::new); System.out.println(s1); /** * 源码: * public T orElse(T other) { * return value != null ? value : other; * } * 解释: 如果 T 为null则返回一个默认值 */ Xttblog s2 = (Xttblog) Optional.ofNullable(xttblog).orElse(new Xttblog()); System.out.println(s2); /** * 源码: * public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { * if (value != null) { * return value; * } else { * throw exceptionSupplier.get(); * } * } * 解释: 如果T为null那么抛出异常(本宝宝非常喜欢) */ Xttblog s3 = Optional.ofNullable(xttblog).orElseThrow(() -> new RuntimeException("www.xttblog.com")); System.out.println(s3);//抛出:java.lang.RuntimeException: www.xttblog.com
fiter/map
//可以加if判断条件过滤 String filter = Optional.ofNullable("").filter((value) -> value.length() > 5).get(); System.out.println(filter); //大小写转换等等.. String map = Optional.ofNullable("www.xttblog.com").map(String::toUpperCase).get(); System.out.println(map);
Optional转集合
Optional是一个集合,虽然里面只有0或者1个元素,但它一样是一个集合。如果要转为List或者Set,一可以有如下几种做法:
public static <T> List<T> toList(Optional<T> option) { return option. map(Collections::singletonList). orElse(Collections.emptyList()); } //或者更传统的写法: public static <T> List<T> toList(Optional<T> option) { if (option.isPresent()) return Collections.singletonList(option.get()); else return Collections.emptyList(); } //但是在java8里,其实只需要这么写: import static java.util.stream.Collectors.*; //转为List List<String> list = collect(opt, toList()); //转为Set Set<String> set = collect(opt, toSet());
其实就这么简单,你干嘛要给自己找借口呢?你说是不是!多学点知识没害处!
: » 还不会Optional?美其名曰JDK8有bug?
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/252687.html