I.はじめに
オプションオプションクラスは、参照任意のGoogleグアバクラスライブラリは、導入された明示的なクラスオプションのヌル値決定(ヌル防御小切手)の使用を回避するために、得られたヌルを回避するために問題を解決するために同じ名前Java8ヌル値判定を持つクラスでありますNPE(NullPointerExceptionが発生)。
のは、コードの一部を見てみましょう:
public static String getGender(Student student)
{
if(null == student)
{
return "Unkown";
}
return student.getGender();
}
これは、学生対象として、学生のセックス、上院の方法を取得する方法である、オブジェクトは学生のヌルを防止し、守備のチェックをした:値がnullの場合は、「未知」に戻ります。
オプションの最適化の使用を見てください:
public static String getGender(Student student)
{
return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown");
}
あなたは、バインディングのオプションの種類を確認できラムダ式使用は、よりシンプルでエレガントなコードを開発することができます。
第二に、任意のオブジェクトを作成します
私たちは、任意のソースコードの一部のようになります。
private static final Optional<?> EMPTY = new Optional<>();
private final T value;
private Optional() {
this.value = null;
}
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
図から分かるように、2つのオプションクラスのコンストラクタは、専用タイプであり、したがって、オブジェクトを作成するために、新たな新規オプション()任意の方法を使用して、クラス外に表示することができないが、クラスは、)空の3つのオプション静的メソッドを(提供( T値)、ofNullable(T値)は、例えば、作成するOptinalオブジェクト。
// 1、创建一个包装对象值为空的Optional对象
Optional<String> optStr = Optional.empty();
// 2、创建包装对象值非空的Optional对象
Optional<String> optStr1 = Optional.of("optional");
// 3、创建包装对象值允许为空的Optional对象
Optional<String> optStr2 = Optional.ofNullable(null);
第三に、一般的なインターフェイスクラスの使用はオプション
例として、以下のいくつかの典型的なシナリオでは、対応するコードと共に、一般的な使用オプションAPIインターフェースを示しています。
3.1 get()メソッド
ソースコードの簡単なget()メソッドを探します。
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
見ることができ、get()メソッドは、主にリターンパッケージオブジェクトの実際の値のために使用されますが、ラッパーオブジェクトがnullの場合、例外ははNoSuchElementExceptionをスローされます。
3.2 isPresent()方法
isPresent()メソッド出典:
public boolean isPresent() {
return value != null;
}
オブジェクトが非ヌル値をパッケージ化するかどうかを決定するため、isPresent()メソッドを見ることができます。ここでは、いくつかの悪いコードを見て:
public static String getGender(Student student)
{
Optional<Student> stuOpt = Optional.ofNullable(student);
if(stuOpt.isPresent())
{
return stuOpt.get().getGender();
}
return "Unkown";
}
このコードは、論理的に最初の章(導入)に実装されていますが、開発者がこの問題を回避する必要があるので、この使用法は、ヌル守備のチェックを減少、およびオプションに反して増加したプロセスオプションパッケージは、もともと設計されていません悪用の種類〜
3.3 ifPresent()メソッド
IfPresent()メソッド出典:
public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}
ifPresent()メソッドは、消費者のオブジェクト(消費関数を)受け入れるラップされたオブジェクトの値が空でない場合は、受け入れ()メソッドは、Consumerオブジェクトを実行します。例としては、次のとおりです:
public static void printName(Student student)
{
Optional.ofNullable(student).ifPresent(u -> System.out.println("The student name is : " + u.getName()));
}
NPEの問題を気にせずに呼び出す前に、NULL値のチェックを行うための内部ifPresent()メソッドに、生徒の名前を印刷するために使用される上記の例。
3.4フィルタ()メソッド
フィルタ()ソース:
public Optional<T> filter(Predicate<? super T> predicate) {
Objects.requireNonNull(predicate);
if (!isPresent())
return this;
else
return predicate.test(value) ? this : empty();
}
フィルタ()メソッドは、それらが述語の条件を満たしている場合は、オプションのオブジェクト自体、そうでなければ空の任意のオブジェクトを返す、パラメータ述語オブジェクト、オプションのフィルタ用として取ります。たとえば、次のように:
public static void filterAge(Student student)
{
Optional.ofNullable(student).filter( u -> u.getAge() > 18).ifPresent(u -> System.out.println("The student age is more than 18."));
}
18スクリーニングより古い学生を達成するために、上記の例で、。
3.5マップ()メソッド
ソースの地図()メソッド:
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}
パラメータマップオプションラップするオブジェクトの()関数のメソッド(関数インタフェース)オブジェクト、マップ()メソッドは、関数の関数を計算し、新たなオプションのオブジェクト(パッケージのオブジェクト・タイプは変更してもよい)にパッケージ。たとえば、次のように:
public static Optional<Integer> getAge(Student student)
{
return Optional.ofNullable(student).map(u -> u.getAge());
}
上記のコード、最初の()メソッドがofNullableオプションの<学生>オブジェクトで構成され、そして次にマップを(使用して学生の年齢を計算している)、学生がnullの場合、(オプションの<整数>オブジェクトを返すは、(マップを返す)メソッドは空Optinalを返しますオブジェクト)。
3.6 flatMap()メソッド
flatMap()メソッド出典:
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Objects.requireNonNull(mapper.apply(value));
}
}
地図()メソッドが異なると、基準関数の戻り値関数型オプションの<U>のタイプではなく、U型、一次元オブジェクトに二次元マップすることができるようflatMap()オプションのオブジェクト。次のように、一例として実施例3.5の関数として、faltMap()が書き換えられます。
public static Optional<Integer> getAge(Student student)
{
return Optional.ofNullable(student).flatMap(u -> Optional.ofNullable(u.getAge()));
}
3.7 orElse()メソッド
orElse()メソッド出典:
public T orElse(T other) {
return value != null ? value : other;
}
オブジェクトがパッケージングされる場合orElse()関数は、包装対象値が返され、他のパラメータのそうでなければ、戻り値(デフォルト値)は比較的簡単な方法、すなわち、非ヌル値です。コードで前記第一章(プロファイル)のように:
public static String getGender(Student student)
{
return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown");
}
3.7 orElseGet()メソッド
orElseGet()メソッド出典:
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
サプライヤへのオブジェクト参照にそのorElseGet()メソッドを除いて同様orElseGet()メソッドorElse()メソッド、サプライヤーはデフォルト値()メソッドとして戻り値を持つオブジェクトを取得します。以下のような:
public static String getGender(Student student)
{
return Optional.ofNullable(student).map(u -> u.getGender()).orElseGet(() -> "Unkown");
}
3.8 orElseThrow()メソッド
orElseThrow()メソッド出典:
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
orElseThrow()メソッドと実際にorElseGet()メソッドは非常に類似しており、パラメータは、サプライヤーのオブジェクトですが、orElseThrow()サプライヤーは、Throwableオブジェクトが異常である、と()を返す必要がありますorElseThrowで例外がスローされます。
public static String getGender1(Student student)
{
return Optional.ofNullable(student).map(u -> u.getGender()).orElseThrow(() -> new RuntimeException("Unkown"));
}
orElseThrow()メソッドは、必要スローされた例外のシーンにおける特定の被写体を空の包装に適しています。
IV注意事項
注意オプションオプションと一緒に使用されるために)(isPresent注意して使用し、3.2節で述べた間違ったデモンストレーションを使用しないように特別な注意を「ジェスチャー」の適切な使用を開発)と、マップの()メソッド、可能な限り使用(取得、フィルタ()、orElse( )および他の方法は、オプションの役割を果たしています。