web-dev-qa-db-ja.com

NULLセーフオブジェクトチェックインJava 8

だから私は、値内に含まれる値に対してヌルセーフチェックを行いたいです。

だから私はお互いの中に含まれる3つのオブジェクトを持っています:

人は、首都を持つ国オブジェクトを持つ衣服オブジェクトを持っています

そのため、人は服を着ていない可能性があるため、このようなチェックではNULLポインターがスローされます。

if (person.getClothes.getCountry.getCapital)

パス上のオブジェクトのいずれかがnullの場合、どうすればこのようなステートメントをfalseに戻すことができますか?

私もこの方法でやりたくありません。 (可能であれば、Java-8のワンライナー。

if (person !=null) {
    if (person.getClothes != null) {
        if (person.getClothes.getCountry !=null) {
            etc....
        }
    }
}
6
Blawless

Optional::mapを介してこれらの呼び出しをすべてチェーンできます。これはif/elseより読みやすいと思いますが、それは私だけかもしれません

Optional.ofNullable(person.getClothes())
        .map(Clothes::getCountry)
        .map(Country::getCapital)
        .ifPresent(...)
10
Eugene

これらの「カスケード」ヌルチェックは、本当に妄想的で防御的なプログラミングです。質問から始めましょう。このようなデータ構造に格納する前に、すぐに失敗させたり、入力を検証したりする方が良いでしょうか?

質問に移ります。ネストした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(...)
3
Nikolas

あなたが_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です。

1
manikant gautam

単一行のコードを使用して達成できます

if (person != null && person.getClothes != null && person.getClothes.getCountry != null) { }

ご存知のように、=および==

演算子&&および||ショートサーキットです。つまり、左辺の式の値が結果を決定するのに十分な場合、右辺の式を評価しません。

最初の式がtrueの場合、次の式のみがチェックされます。

最初の式がfalseの場合、次の式をチェックしません。

したがって、personがnullでない場合の要件としては、person.getClothes != null 等々。

1
Sagar Gangwal