Optional 真香
下面是以前不会用 Optional 自己想着一直实现
这里就不对 Optional 做介绍了
实体类:
public class User
{
private User son;
private String name
// 忽略get set
}
测试:
@Test
public void test1()
{
User user = new User();
// 这样获取难免会出现空指针
user.getSon().getSon().getSon().getSon().getSon();
// 先判断再获取
if(null != user.getSon() && null !=user.getSon().getSon() && null != user.getSon().getSon().getSon() && null != user.getSon().getSon().getSon().getSon())
{
// 这样就不会出现空指针了, 但是写法很麻烦
user.getSon().getSon().getSon().getSon().getSon();
}
// java8 新出了一个 Optional 类,这里我不太会用,但是我感觉像上面的情况还是很繁琐 真喜欢 js中的 ?.语法 根本不会出现空指针这种情况
}
自己利用java8Lambda的特性封装方法
public class LambdaUtils
{
/**
* 处理在获取对象的时候,可能出现空指针的情况
* 如果出现空指针,则返回 null
* @param supplier 获取值
* @param <T>
* @return 正常情况下返回 预期值
* 出现空指针 返回 null
*/
public static <T> T nullHandle(Supplier<T> supplier)
{
try
{
return supplier.get();
}
catch (NullPointerException e)
{
return null;
}
}
/**
* 处理在获取对象的时候,可能出现空指针的情况
* 如果出现空指针,则返回 默认值
* @param supplier 获取值
* @param <T>
* @param def 默认值
* @return 正常情况下返回 预期值
* 出现空指针 返回 默认值
*/
public static<T> T nullHandle(Supplier<T> supplier, T def)
{
try
{
return supplier.get();
}
catch (NullPointerException e)
{
return def;
}
}
}
测试
@Test
public void test()
{
User user = new User();
User u1 = LambdaUtils.nullHandle(() -> user.getSon().getSon().getSon().getSon().getSon());
User user1 = new User();
User user2 = new User();
User user3 = new User();
User user4 = new User();
User user5 = new User();
user.setSon(user1);
user1.setSon(user2);
user2.setSon(user3);
user3.setSon(user4);
user4.setSon(user5);
User u2 = LambdaUtils.nullHandle(() -> user.getSon().getSon().getSon().getSon().getSon());
System.out.println(u1); // null
System.out.println(u2); // User(userName=null, age=null, sex=null, phone=null, son=null)
// 试例
// 多数情况下,我们只是想它匹配上才进入if, 并不想关注它会不会空指针
// 但是下面这样写就难免会出现空指针
if("小胖".equals(user.getSon().getSon().getSon().getName()))
{
System.out.println(user);
}
// 这样就不用关心它会不会出现空指针了
if(LambdaUtils.nullHandle(() -> "小胖".equals(user.getSon().getSon().getSon().getName()), false))
{
System.out.println(user);
}
}