Upgrading to Java 8——第三章Optional and Simiar Class es

9356 ワード

Javaプログラマは空の針の異常に対処してもう長い間になりました。Java 8では彼らを処理する新しい方法があります。包装を通して潜在的なnullと呼ばれる種類をOptianalといいます。
Java 8にthe Optional、Optional Int、Optional Long、Optional Double類を追加して空の指針異常を処理します。
java.utilのカバンの中には、Lambada表現と方法を使って引用するサンプルがたくさんあります。
この四つの種類はよく似ています。Optionalは彼らの中で一番重要な種類です。彼はどのタイプでも使えるので、他の種類はそれぞれinteger、long、doubleでしか使えません。
 Optionalはnullになり得る値を含む容器です。nullの引用に行って方法を呼び出すか、または属性に異常が生じることを認識してください。空の針の異常処理は難しくないですが、味気ないです。
次のコードを考えると、一つの会社にオフィスがあり、さらに住所があります。簡単のために、ここの住所には二つの属性があります。街と都市です。これらの属性は全部nullです。一つの会社はオフィスがないかもしれません。住所は完全な街と都市の情報がないかもしれません。
class Company {

    private String name;

    private Office office;



    public Company(String name, Office office) {

    this.name = name;

    this.office = office;

    }



    public String getName() {

    return name;

    }



    public Office getOffice() {

    return office;

    }

}



class Office {

    private String id;

    private Address address;



    public Office(String id, Address address) {

    this.id = id;

    this.address = address;

    }



    public String getId() {

    return id;

    }



    public Address getAddress() {

    return address;

    }

}



class Address {

    private String street;

    private String city;



    public Address(String street, String city) {

    this.street = street;

    this.city = city;

    }



    public String getStreet() {

    return street;

    }



    public String getCity() {

    return city;

    }

}



public class OptionalDemo1 {



    public static void main(String[] args) {

    Address address1 = new Address(null, "New York");

    Office office1 = new Office("OF1", address1);

    Company company1 = new Company("Door Never Closed", office1);



    // What is the street address of company1?

    // In which city company1 is located?

    String streetAddress = null;

    String city = null;

    if (company1 != null) {

        Office office = company1.getOffice();

        if (office != null) {

        Address address = office.getAddress();

        if (address != null) {

            streetAddress = address.getStreet();

            city = address.getCity();

        }

        }

    }

    System.out.println("Street Name:" + streetAddress);

    System.out.println("City:" + city);

    }

}
Optional Demo 1類はテストのためにCompanyのインスタンスを作成して会社の住所を取得します。すべての属性は空かもしれないと考えて、私達はメソッドを呼び出す前に空ではない処理をしました。下記のコードのようです。
if (company1 != null) {

            Office office = company1.getOffice();



            if (office != null) {

                Address address = office.getAddress();

                if (address != null) {

                    streetAddress = address.getStreet();

                    city = address.getCity();

                }

            } 

        }
このコードは退屈でもありますし、読むと苦労します。この時Optionalがあなたを助けてくれるなら、それを使うと決めたら、nullの属性を全部Optionalで包装する必要があります。例えば、Companyクラスのoffice属性はこうであるべきです。private Optional<Office> office;Addressクラスのcity属性は、このようなものであるべきである。private Optional<String> city;上のコードを書き換える前に、Optional類のいくつかの方法を見てください。
方法
説明
empty
空のOptionalクラスを返します。
filter
値が存在し、与えられたPrdicateインターフェースにマッチする場合、Optiaonal記述の値を返します。そうでなければ、空のOptionalクラスを返します。
flatMap
値が存在する場合、指定されたマッピング方法を適用して、Optionalクラス記述のマッピング結果を返します。値が存在しない場合は、空のOptionalクラスに戻ります。
get
値が存在する場合、その値を返します。さもなければ、NoSuchElemenntExceptionが異常です。
ifPresent
値が存在する場合は、指定のConsmerインターフェースを呼び出してこの値を使います。
isPresent
値が存在する場合、trueに戻ります。そうでなければfalseを返します。
map
値が存在する場合は、指定されたマッピング方法を適用します。結果がnullでない場合は、Optionalクラスの説明結果を返します。
保存先
Optionalで説明されているnullではない値を返します。
ONullable
与えられた値がnullでない場合は、Optional記述の値を返します。nullであれば、空のOptionalクラスに戻ります。
オルルス
値が存在する場合、その値を返します。そうでなければ、指定された値を返します。                                    
 
 
 
 
 
 
 
  
 
 
 
これらの方法は使いやすいです。Optionalクラスに値を包装して、その静的な方法orまたはorNullableを呼び出します。もしあなたが包装した値がnullでないと確定したら、ofメソッドを使います。値が潜在的に存在する場合は、ONullable方法を用いる。したがって、empty静的方法は、Optionalクラスのような、値のないOptionalクラスを返す。
残りの方法はOptionalに対する処理です。簡単に検索したいなら、Optionalで値が存在するかどうかをまずチェックして、isPresent方法を使って、get方法を使ってもいいです。
if (optional.isPresent()) {

    value = optional.get();

}
いずれにしても、Optionalでnullを処理しない場合と似ていますが、これはより良い方法です。ifPresentメソッドはConsmer関数式インターフェースを受信します。値が存在すると呼び出されますので、簡単に値を印刷したいなら、このようにしてもいいです。optional.ifPresent(System.out::println);値が存在すれば、何も起こらない。
flatMapfang法はマッピング方法を適用してOptional記述の値を返します。これらだけではなく、カスケードで呼び出されます。次のように一連のnullの場合を確認します。
company1.flatMap(Company::getOffice)

        .flatMap(Office::getAddress)

        .flatMap(Address::getCity)

        .ifPresent(System.out::println);
今、Optional類を使ってOptional Demo 2類を書き直します。OptionalInt、Optional Long and Optional DoubleにはOptionalのサブセットの方法があります。彼らはすべてemptyがあって、ifPresent、isPresent、ofは原始タイプが必要です。オリジナルタイプはnullではないので、ONullableとget方法はありません。代わりに、OptionalIntにはget ArtInt方法があり、Optional Longにはget AspLong方法があり、OptiaonalDoubleにはget ADouble方法があります。彼らはfilterとflatMapとmapの方法がありません。