Java8 新特性 Optional
1 package test; 2 3 import java.util.Optional; 4 5 import org.junit.Test; 6 /** 7 * Optional 类是一个可以为null的容器对象。 8 * 如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。 9 * 用于解决空指针异常 10 * @author xiaou 11 * 12 */ 13 public class TestA { 14 public static void main(String[] args) { 15 String name = null; 16 String tip ="对象为null"; 17 18 /* 19 * 判断对象是否未空,如果为空则返回tip值 20 * orElse 和 orElseGet 区别 21 * orElse 是不管对象是不是null都会创建对象 22 * orElseGet 如果对象为null时才会创建对象 23 */ 24 String opt = Optional.ofNullable(name).orElse(tip); 25 // 参数是一个函数式接口 26 String opt2 = Optional.ofNullable(name).orElseGet(()->tip); 27 System.out.println(opt); 28 System.out.println(opt2); 29 } 30 @Test 31 public void test2test() { 32 String name = null; 33 String tip ="..."; 34 Optional<String> nullable = Optional.ofNullable(name); 35 // 如果不写这条语句也有可能会造成空指针异常 36 if(nullable.isPresent()) { 37 System.out.println(nullable.get().length()); 38 } 39 40 //String opt = Optional.ofNullable(name).orElse(tip); 41 42 } 43 /** 44 * 返回异常 45 * 46 */ 47 @Test(expected = IllegalArgumentException.class) 48 public void test3test() { 49 String name = null; 50 String tip ="..."; 51 String nullable = Optional.ofNullable(name).orElseThrow(()->new IllegalArgumentException()); 52 System.out.println(nullable); 53 } 54 /** 55 * 过滤值 56 */ 57 @Test 58 public void test4test() { 59 String name = "26303qq.com"; 60 Optional<String> opt = Optional.ofNullable(name).filter((u)->u.contains("@")); 61 if (opt.isPresent()) 62 System.out.println(opt.get().toString()); 63 } 64 65 /** 66 * map 67 */ 68 @Test 69 public void test5test() { 70 User user = new User("xiaou", "2@qq.com"); 71 Optional<String>email = Optional.ofNullable(user).map(u->u.getEmail()); 72 System.out.println(email.get()); 73 } 74 /* 75 * flatMap与map(Function)非常类似,区别在于传入方法的lambda表达式的返回类型。 76 * map方法中的lambda表达式返回值可以是任意类型,在map函数返回之前会包装为Optional。 77 * 但flatMap方法中的lambda表达式返回值必须是Optionl实例。 78 */ 79 /** 80 * flatmap 81 */ 82 @Test 83 public void test6test() { 84 User user = new User("xiaou", "2@qq.com"); 85 // 第一种 86 Optional<String>email = Optional.ofNullable(user).flatMap(u->Optional.of(u.getEmail())); 87 // 第二种 在user对象中添加一个方法 返回Option对象 88 Optional<String>email2 = Optional.ofNullable(user).flatMap(User::getOptionalByEmail); 89 System.out.println(email.orElse("ss")); 90 System.out.println(email2.get()); 91 } 92 93 94 }
1 package test; 2 3 import java.util.Optional; 4 5 public class User { 6 private String name; 7 private String email; 8 9 public User() { 10 super(); 11 } 12 public User(String name, String email) { 13 super(); 14 this.name = name; 15 this.email = email; 16 } 17 public String getName() { 18 return name; 19 } 20 public void setName(String name) { 21 this.name = name; 22 } 23 public String getEmail() { 24 return email; 25 } 26 public void setEmail(String email) { 27 this.email = email; 28 } 29 30 public Optional<String> getOptionalByEmail(){ 31 return Optional.ofNullable(email); 32 } 33 }