Optional篇

 1 import lombok.AllArgsConstructor;
 2 import lombok.Data;
 3 import lombok.NoArgsConstructor;
 4 
 5 @Data
 6 @NoArgsConstructor
 7 @AllArgsConstructor
 8 public class User {
 9 
10     private String id;
11     private String name;
12 }
 1 import lombok.AllArgsConstructor;
 2 import lombok.NoArgsConstructor;
 3 import java.util.Optional;
 4 
 5 
 6 @NoArgsConstructor
 7 @AllArgsConstructor
 8 public class UserOptional {
 9 
10     private String id;
11     private String name;
12     private User user;
13 
14     public String getName() {
15         return name;
16     }
17 
18     public void setName(String name) {
19         this.name = name;
20     }
21 
22     public Optional<User> getUser() {
23         return Optional.ofNullable(user);
24     }
25 
26     public void setUser(User user) {
27         this.user = user;
28     }
29 
30     public String getId() {
31         return id;
32     }
33 
34     public void setId(String id) {
35         this.id = id;
36     }
37 }
 1 import java.util.List;
 2 import java.util.Optional;
 3 import java.util.stream.Collectors;
 4 
 5 public class StudyOptional {
 6 
 7     public static void main(String[] args) {
 8 
 9         // Optional使用方式1:创建一个空的Optional对象
10         Optional<User> emptyOpt = Optional.empty();
11         emptyOpt.get(); // 空的Optional对象中value默认是Null,此处的get获取值的时候会抛空指针
12 
13         // Optional使用方式2:of()方法,用于实例化一个值非空的Optional
14         User u = Optional.of(new User("1", "张三")).get();
15 
16         // Optional使用方式3:of()方法,用于实例化一个值可能非空或者为空的Optional
17         // 使用ofNullable的值可以为空,所以通过ofNullable获取的Optional的值可以先进行断言在使用,避免空指针
18         Optional<User> opt = Optional.ofNullable(new User());
19         if (opt.isPresent()) { // 返回当前Optional的值是否为空
20             String id = opt.get().getId();
21             System.out.println(id);
22         }
23 
24         // Optional使用方式4:orElse()方法 ,如果当前Optional有值,则直接返回Optional的值,没有则返回orElse()参数中的值
25         User u2 = Optional.ofNullable(new User()).orElse(new User("2", "李四"));
26 
27         // Optional使用方式5:orElseGet()方法,如果有值的时候返回值,如果没有值,它会执行作为参数传入的 Supplier(供应者) 函数式接口,并将返回其执行结果
28         User u3 = Optional.ofNullable(new User()).orElseGet(() -> new User("3", "王五"));
29 
30         // Optional使用方式6: orElseThrow()方法,如果对象为空的时候抛出异常
31         User u4 = Optional.ofNullable(new User()).orElseThrow(NullPointerException::new); // 可以决定抛出什么样的异常
32 
33         // 注意点:orElse()无论Optional值是否为空,都会将默认值User创建出来,而orElseGet()当Optional的值为空的时候才会创建
34         // 在执行比较密集的情况下,orElse()还是相比较而言影响性能
35 
36         // Optional使用方式7:map() ,对值调用作为参数的函数,且将返回值包装到Optional中
37         String userName = Optional.ofNullable(new User()).map(User::getName).orElseGet(() -> "老王");
38 
39         // Optional使用方式8:flatMap() ,参数的类型需要参数继承Optional<T>,此处的getUser()返回的是Optional<User>
40         Optional<User> user1 = Optional.ofNullable(new UserOptional("4", "赵六", new User("5", "老赵"))).flatMap(UserOptional::getUser);
41         User user = Optional.ofNullable(new UserOptional("4", "赵六", new User("5", "老赵"))).flatMap(UserOptional::getUser).orElse(new User());
42 
43         // Optional使用方式9:filter() ,接受一个 Predicate 参数,返回测试结果为 true 的值。如果测试结果为 false,会返回一个空的 Optional
44         // 如果满足过来条件,会返回非空值
45         Optional<User> user2 = Optional.ofNullable(new User("6", "老七")).filter(u6 -> "老七".equals(u6.getName()));
46 
47         // Optional使用方式10:ifPresent(),如果参数不为空,则调用参数中的函数
48         Optional.ofNullable(new User("7", "老七")).ifPresent(System.out::println);
49 
50         // Optional使用方式11:isPresent(),判断值是否不为空
51 
52         // jdk9:Optional使用方式12:or()的返回值是由 Supplier 参数产生的另一个 Optional 对象
53         // 当Optional.ofNullable(new User("8", "老八"))中的值为空,则会返回or中函数返回的Optional 对象
54         User user4 = Optional.ofNullable(new User("8", "老八")).or(() -> Optional.of(new User("9", "老九"))).get();
55 
56         // jdk9:Optional使用方式13:ifPresentOrElse()
57         // 方法接受两个参数:一个 Consumer 和一个 Runnable。如果对象包含值,会执行 Consumer 的动作,否则运行 Runnable
58         User user5 = null;
59         Optional.ofNullable(user5).ifPresentOrElse(u10 -> System.out.println(u10.getName()), () -> System.out.println("User is Null"));
60 
61         // stream() 方法,它通过把实例转换为 Stream 对象
62         List<String> collect = Optional.of(new User("10", "老十")).stream().filter(u11 -> u11.getName().contains("老")).map(User::getName).collect(Collectors.toList());
63         System.out.println(collect);
64     }
65 }

 

posted @ 2020-07-24 15:15  为你编程  阅读(130)  评论(0)    收藏  举报