Java 如果优雅的非空判断

  太长不想看:使用Java8开始能用Optional类包装Object。 代码如下

  正文。
  无聊开始看看Java,然后心血来潮,准备把之前做过的IOC和Proxy的代理demo升级一下。做一个简单的aspectj,基础功能大概就是给方法添加注解,注解内指定类以及方法,然后在执行指定方法的同时,执行加了注解的方法。具体功能参照aspectj,但是挑几个好实现的@Before和@After实现。
  在review之前的代码的时候发现这么一串代码
example
  可以看到红色框框内有俩if(object!=null)的判断,算上上面的url!=null总共三个非空判断。说实话,写习惯JavaScript的我现在看到这个代码就有点脑壳痛了。这种if(true) 执行,false不做执行的代码块,在JavaScript里面比较常见用链式写法,类似于 a.isNull( input => { doSomething() return result; } ).then(result => result === null).then(condition => {});这种链式写法在我眼中更简介,在读代码的时候不会因为一个!=null就脑子一卡。所以在写功能之前,我想先找办法把这个大量非空判断解决掉。
  非常让人开心的是,在bing直接搜java avoid !=null statement,发现早有人在StackOverflow上面问过了(没有什么问题是StackOverflow上面没有的,如果有,换个表述方式再搜一遍)。里面的最高票答案推荐了两个办法,1:使用assert来定义成员属性,这就算了,完全不是这里的需求。2:自个儿写类和方法去包装object,这也算了….虽然有示例代码,但是说实话问题复杂化了。
  最后找到一个回答说Java8开始推荐使用Optional类,确实挺好用的,可以用Optional.ofNullable(object).ifPresent(object ->{doSomething()})。形式避免非空判断,但是由于Java的lambda表达式有点问题,我们无法在lambda表达式外catch住lambda内部的exception,所以里面的代码如果throw exception的话,我们就需要在里面写一份try catch,连直接声明throws exception都不行。具体可以看最上面的图。