Java8 新特性 Optional

 1 package test;
 2 
 3 import java.util.Optional;
 4 
 5 import org.junit.Test;
 6 /**
 7  * Optional 类是一个可以为null的容器对象。
 8  * 如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
 9  * 用于解决空指针异常
10  * @author xiaou
11  *
12  */
13 public class TestA {
14     public static void main(String[] args) {
15         String name = null;
16         String tip ="对象为null";
17         
18         /*
19          *  判断对象是否未空,如果为空则返回tip值
20          *  orElse 和 orElseGet 区别
21          *  orElse 是不管对象是不是null都会创建对象
22          *  orElseGet 如果对象为null时才会创建对象
23          */
24         String opt = Optional.ofNullable(name).orElse(tip);
25         // 参数是一个函数式接口
26         String opt2 = Optional.ofNullable(name).orElseGet(()->tip);
27         System.out.println(opt);
28         System.out.println(opt2);
29     }
30     @Test
31     public void test2test() {
32         String name = null;
33         String tip ="...";
34          Optional<String> nullable = Optional.ofNullable(name);
35          //  如果不写这条语句也有可能会造成空指针异常
36          if(nullable.isPresent()) {
37              System.out.println(nullable.get().length());
38          }
39          
40         //String opt = Optional.ofNullable(name).orElse(tip);
41         
42     }
43     /**
44      * 返回异常
45      *
46      */
47     @Test(expected = IllegalArgumentException.class)
48     public void test3test()  {
49         String name = null;
50         String tip ="...";
51         String nullable = Optional.ofNullable(name).orElseThrow(()->new IllegalArgumentException());
52         System.out.println(nullable);
53     }
54     /**
55      * 过滤值
56      */
57     @Test
58     public void test4test() {
59         String name = "26303qq.com";
60         Optional<String> opt = Optional.ofNullable(name).filter((u)->u.contains("@"));
61         if (opt.isPresent())
62             System.out.println(opt.get().toString());
63     }
64     
65     /**
66      * map
67      */
68     @Test
69     public void test5test() {
70         User user = new User("xiaou", "2@qq.com");
71         Optional<String>email = Optional.ofNullable(user).map(u->u.getEmail());
72         System.out.println(email.get());
73     }
74     /*
75      * flatMap与map(Function)非常类似,区别在于传入方法的lambda表达式的返回类型。
76      * map方法中的lambda表达式返回值可以是任意类型,在map函数返回之前会包装为Optional。 
77      * 但flatMap方法中的lambda表达式返回值必须是Optionl实例。 
78      */
79     /**
80      * flatmap
81      */
82     @Test
83     public void test6test() {
84         User user = new User("xiaou", "2@qq.com");
85         // 第一种
86         Optional<String>email = Optional.ofNullable(user).flatMap(u->Optional.of(u.getEmail()));
87         // 第二种 在user对象中添加一个方法 返回Option对象
88         Optional<String>email2 = Optional.ofNullable(user).flatMap(User::getOptionalByEmail);
89         System.out.println(email.orElse("ss"));
90         System.out.println(email2.get());
91     }
92     
93 
94 }
 1 package test;
 2 
 3 import java.util.Optional;
 4 
 5 public class User {
 6     private String name;
 7     private String email;
 8     
 9     public User() {
10         super();
11     }
12     public User(String name, String email) {
13         super();
14         this.name = name;
15         this.email = email;
16     }
17     public String getName() {
18         return name;
19     }
20     public void setName(String name) {
21         this.name = name;
22     }
23     public String getEmail() {
24         return email;
25     }
26     public void setEmail(String email) {
27         this.email = email;
28     }
29     
30     public Optional<String> getOptionalByEmail(){
31         return Optional.ofNullable(email);
32     }
33 }
View Code

 

posted @ 2018-09-25 22:58  Masukotto&xiaou  阅读(233)  评论(0编辑  收藏  举报