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 }