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 }