Java8新特性之Optional

Java新特性之Optional

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

of

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

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

在这里插入图片描述

ofNullable

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

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

在这里插入图片描述

isPresent

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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("默认字符串"));  
}  

在这里插入图片描述

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

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

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

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

12. 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));  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sgy_yuebin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值