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 }