だから私は、値内に含まれる値に対してヌルセーフチェックを行いたいです。
だから私はお互いの中に含まれる3つのオブジェクトを持っています:
人は、首都を持つ国オブジェクトを持つ衣服オブジェクトを持っています
そのため、人は服を着ていない可能性があるため、このようなチェックではNULLポインターがスローされます。
if (person.getClothes.getCountry.getCapital)
パス上のオブジェクトのいずれかがnullの場合、どうすればこのようなステートメントをfalseに戻すことができますか?
私もこの方法でやりたくありません。 (可能であれば、Java-8のワンライナー。
if (person !=null) {
if (person.getClothes != null) {
if (person.getClothes.getCountry !=null) {
etc....
}
}
}
Optional::map
を介してこれらの呼び出しをすべてチェーンできます。これはif/else
より読みやすいと思いますが、それは私だけかもしれません
Optional.ofNullable(person.getClothes())
.map(Clothes::getCountry)
.map(Country::getCapital)
.ifPresent(...)
これらの「カスケード」ヌルチェックは、本当に妄想的で防御的なプログラミングです。質問から始めましょう。このようなデータ構造に格納する前に、すぐに失敗させたり、入力を検証したりする方が良いでしょうか?
質問に移ります。ネストしたnullチェックを使用したので、Optional<T>
およびOptional::map
メソッドを使用して同様の操作を行うことができます。これにより、より適切な制御が可能になります。
Optional.ofNullable(person.getClothes())
.map(clothes -> clothes.getCountry())
.map(country -> country.getCapital())
.orElse(..) // or throw an exception.. or use ifPresent(...)
あなたが_Java -8
_を述べたように、これはあなたが望むものです
_Objects.isNull(person) //returns true if the object is null
Objects.nonNull(person) //returns true if object is not-null
Optional.ofNullable(person.getClothes())
.flatMap(Clothes::getCountry)
.flatMap(Country::getCapital)
.ifPresent(...)
_
Optionalを使用し、nullを使用しないことで、nullチェックを完全に回避できます。これらは必要ないため、NPEにつながるヌルチェックを省略することも避けてください。それでも、nullの可能性があるレガシーコード(Map、...)から返される値は、オプションでできるだけ早くラップされるようにしてください。 ここをチェック
_if(Objects.nonNull(person) && Objects.nonNull(person.getClothes) && Objects.nonNull(person.getClothes.getCountry )){
// do what ever u want
}
_
Collections
で操作し、_org.Apache.commons
_を使用している場合、CollectionUtils.isNotEmpty(persons)
およびCollectionUtils.isEmpty(persons)
が機能します。ここで、Persons
は個人のList
です。
単一行のコードを使用して達成できます
if (person != null && person.getClothes != null && person.getClothes.getCountry != null) { }
ご存知のように、=
および==
。
演算子&&および||ショートサーキットです。つまり、左辺の式の値が結果を決定するのに十分な場合、右辺の式を評価しません。
最初の式がtrueの場合、次の式のみがチェックされます。
最初の式がfalseの場合、次の式をチェックしません。
したがって、personがnullでない場合の要件としては、person.getClothes != null
等々。