Java新特性之Optional

  Optional类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常。

of

为非null的值创建一个Optional,如果值为null,则会抛出NullPointerException

  1. public static void main(String[] args) {
  2. User user = null;
  3. Optional<User> user1 = Optional.of(user);
  4. System.out.println(user1);
  5. }

1610803564862.png

ofNullable

为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。

  1. public static void main(String[] args) {
  2. User user = null;
  3. Optional<User> user1 = Optional.ofNullable(user);
  4. System.out.println(user1);
  5. user = new User();
  6. Optional<User> user2 = Optional.ofNullable(user);
  7. System.out.println(user2);
  8. }

1610803564889.png

isPresent

如果值存在返回true,否则返回false。

  1. public static void main(String[] args) {
  2. User user = null;
  3. Optional<User> user1 = Optional.ofNullable(user);
  4. System.out.println(user1);
  5. System.out.println(user1.isPresent());
  6. user = new User();
  7. Optional<User> user2 = Optional.ofNullable(user);
  8. System.out.println(user2);
  9. System.out.println(user2.isPresent());
  10. }

1610803564911.png

get

如果Optional有值则将其返回,否则抛出NoSuchElementException。

public static void main(String[] args) {  
    User user = null;  
    Optional<User> user1 = Optional.ofNullable(user);  
    System.out.println(user1);  
    System.out.println(user1.isPresent());  
    System.out.println(user1.get());  

}

1610803564941.png

ifPresent

如果Optional实例有值则为其调用consumer,否则不做处理 。隐士地其中进行了null判断。

public static void main(String[] args) {  
    User u1 = null;  
    User u2 = new User();  
    u2.setName("光阳");  

    Optional<User> optionalUser1 = Optional.ofNullable(u1);  
    Optional<User> optionalUser2 = Optional.ofNullable(u2);  

    optionalUser1.ifPresent(u -> System.out.println("optionalUser1=" + u.getName()));  
    optionalUser2.ifPresent(u -> System.out.println("optionalUser2=" + u.getName()));  
}

1610803564970.png

orElse

如果有值则将其返回,否则返回指定的其它值。

public static void main(String[] args) {  
    String str1 = null;  
    String str2 = "我是谁";  

    Optional<String> optionalStr1 = Optional.ofNullable(str1);  
    Optional<String> optionalStr2 = Optional.ofNullable(str2);  

    System.out.println("optionalUser1 = " + optionalStr1.orElse("默认字符串"));  
    System.out.println("optionalUser2 = " + optionalStr2.orElse("默认字符串"));  
}

1610803564997.png

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));  
}

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())));  
}

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"));  
    });  
}

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("还会没有吗"));  
}

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));  
}