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です。一つの会社はオフィスがないかもしれません。住所は完全な街と都市の情報がないかもしれません。
方法
説明
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方法を使ってもいいです。
flatMapfang法はマッピング方法を適用してOptional記述の値を返します。これらだけではなく、カスケードで呼び出されます。次のように一連のnullの場合を確認します。
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の方法がありません。