【Java】可选记录
在中国,不与遗留代码相关的可选项
最近第一次在工作中使用了,感到非常开心,所以为了以后也能够使用,做了使用示例的备忘录。
我在一个2019年的全新项目中,工作地方要求使用Java1.6版本。迄今为止,我没有太多接触Java8的机会。在这种情况下,我写了一些关于Java8的信息,听说从Java8开始,空指针检查变得更简单。我已经查看了多个网站以确保准确性,但如果有任何更好的建议或改善方法,请务必留下评论。(由于项目中没有人可以对我的代码进行审查,所以我负责审核其他成员的代码。)
关于”get”的内容
由于不知道该如何使用,所以我没有使用。
我看了一些网站后,发现了“不要过度使用get”的观点,所以相反,可能是正确的选择吧?有这样的感觉。
请留意
「Optionalは、単純に従来のnullチェックを置換できるという認識は間違いでした。実際には、Optionalを使用することで、nullチェックを忘れる可能性をなくすために、nullチェックを強制することができます。したがって、サンプルコードは動作するかもしれませんが、書かれたコードは正しい使用方法とは言えません。この記事を削除せずに残す理由は、初めてOptionalを使う人が引っかからないようにするためです。@sikaniさん、ありがとうございました!やはり専門家にレビューしてもらわないといけませんね。他人のレビューで、Optionalで書くことを指摘していなかったのは、不運中の幸いでした。(Java8のコードを強制されないケースなので)」
示例代码
Java1.6特意使用了一些不好的写法。Java8写得很简洁。
虽然Java8的用法有点错误。
Java1.6也可以用三元运算符一行写完,但是ret只是多余的,连早早返回都不做,反而使用if-else,私有方法也不断写if语句的类型的项目中,绝大部分都是糟糕的遗留代码,每次重构都让我心力交瘁。更不用说使用Java8了,但是仍有太多成员仍然使用Java1.6的写法,真是让人不禁哈哈大笑。我担心被误解为是自傲的人。。我想起最近热火朝天的高下论战。真抱歉我在发牢骚。
public String toStringIfNotNull(final Object obj) {
String ret;
if (obj == null) {
ret = null;
} else {
ret = obj.toString();
}
return ret;
}
public String toStringIfNotNull(final Object obj) {
return Optional.ofNullable(obj).map(Object::toString).orElse(null);
}
如果使用Optional而不是空值检查,那么使用ofNullable和orElse的组合是否是最佳选择呢?我有这样的印象。如果非空,只需将原始值直接返回,这样就不需要map或其他中间处理了。
除了 map 之外,还有 filter 和 flatMap。
当 filter 结果为 null 或 false 时,返回 orElse 的参数。
当 flatMap 结果为 null 时,返回 orElse 的参数,但是当 flatMap 处理的结果为 null 时,会抛出 NullPointerException。(对于 map ,即使处理结果为 null,也会返回 orElse 的参数)
如果要根据null与否来分支处理,据说可以写成if (Optional.ofNullable(obj).isPresent())!
另外,isPresent只返回布尔值,但如果改成ifPresent并传入一个lambda表达式作为参数,那么只有在非null情况下才会执行该参数的lambda表达式,据说可以这样写。
不过,如果是Java 7或更高版本的话,我觉得用if (Objects.isNull(obj))(nonNull)来分支会更简洁。
写到这里我才意识到,如果是处理示例代码的内容的话,可以用Objects.toString(obj, null)(类似于StringUtils.defaultString)就可以了…我确认得不够仔细。