Javaの財団(二十から三)を強化 - 新しいクラスJava8のオプション機能

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( )および他の方法は、オプションの役割を果たしています。

おすすめ

転載: www.cnblogs.com/tang-hao-/p/11644253.html