Optional避免空指针

 1 /**
 2  * <h1>学会 Optional, 规避空指针异常。尽量不要isPresent和get方法,使用这些方法没有水平,跟if一样</h1>
3 * */ 4 @SuppressWarnings("all") 5 public class OptionalUsage { 6 7 private static void badUsageOptional() { 8 9 Optional<User> optional = Optional.ofNullable(null); 10 // 对比一下 11 User user = optional.orElse(null); // good 12 user = optional.isPresent() ? optional.get() : null; // bad 13 } 14 15 public static class User { 16 private String name; 17 18 public String getName() { 19 return name; 20 } 21 } 22 // 没有意义的使用方法 23 private static void isUserEqualNull() { 24 25 User user = null; 26 if (user != null) { 27 System.out.println("User is not null"); 28 } else { 29 System.out.println("User is null"); 30 } 31 32 Optional<User> optional = Optional.empty(); 33 if (optional.isPresent()) { 34 System.out.println("User is not null"); 35 } else { 36 System.out.println("User is null"); 37 } 38 } 39 40 private static User anoymos() { 41 return new User(); 42 } 43 44 public static void main(String[] args) { 45 46 // 没有意义的使用方法 47 isUserEqualNull(); 48 49 User user = null; 50 Optional<User> optionalUser = Optional.ofNullable(user); 51 // 存在即返回, 空则提供默认值 52 optionalUser.orElse(new User()); 53 // 存在即返回, 空则由函数去产生 54 optionalUser.orElseGet(() -> anoymos()); 55 // 存在即返回, 否则抛出异常 56 optionalUser.orElseThrow(RuntimeException::new); 57 58 // 存在才去做相应的处理 59 optionalUser.ifPresent(u -> System.out.println(u.getName())); 60 61 // map 可以对 Optional 中的对象执行某种操作, 且会返回一个 Optional 对象 62 optionalUser.map(u -> u.getName()).orElse("anymos"); 63 64 // map 是可以无限级联操作的 65 optionalUser.map(u -> u.getName()).map(name -> name.length()).orElse(0); 66 } 67 }

 例子2:

 1 mport cn.hutool.core.util.StrUtil;
 2 import lombok.*;
 3 
 4 import java.util.Arrays;
 5 import java.util.List;
 6 import java.util.Optional;
 7 
 8 
 9 public class MyOptionUsage {
10 
11     @ToString
12     @Setter
13     @Getter
14     @AllArgsConstructor
15     @NoArgsConstructor
16     public static class User {
17         private String name;
18 
19         private String position;
20 
21         private String organization;
22     }
23 
24     public static void main(String[] args) {
25         User user = new User("1", "1", "1");
26         User user2 = new User("1", "1", "");
27         User user3 = new User("", "", "2");
28         List<User> users = Arrays.asList(user, user2, user3);
29         // 找出不满足要求的
30         Optional<User> first = users.stream().filter(u2 -> u2 != null && hasAtLeastOneValue(u2)).findFirst();
31         if(first.isPresent()){
32             System.out.println(first.get());
33             throw new RuntimeException("参数错误");
34         }
35     }
36 
37     /**
38      * 3个字段至少有1个字段有值
39      * @param user
40      * @return
41      */
42     public static boolean hasAtLeastOneValue(User user) {
43         return StrUtil.isEmpty(user.getName())
44                 && StrUtil.isEmpty(user.getPosition())
45                 && StrUtil.isEmpty(user.getOrganization());
46     }
47 }

 

posted @ 2024-03-21 23:42  Allen_Hao  阅读(3)  评论(0编辑  收藏  举报