还不会Optional?美其名曰JDK8有bug?

程序猿要与时俱进!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?

: » 还不会Optional?美其名曰JDK8有bug?

原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/252687.html

(0)
上一篇 2022年5月4日 17:45
下一篇 2022年5月4日 17:52

相关推荐

发表回复

登录后才能评论