[モダンジャワ動作]Optional


今回のテーマキーワード

  • null参照の問題とnullから離れる理由
  • オプション
  • null
  • ではなく
  • オプション
  • 無価の状況をどう処理しますか?


    場合によっては、
  • Null参照を返すように所有しないことを表す.
  • この場合、実行時にNPEが中断します.
  • このNPEを回避するためにnull確認コードを追加して例外問題を解決します.これは様々な問題を引き起こします.
  • nullによる問題

  • エラーの元
  • コードを乱します.
  • は何の意味もありません.
  • nullは何の意味も表さないので、値がないことを表すのに適していません.
  • ジャワ哲学に背く.
  • javaはすべてのポインタを非表示にしますが、nullポインタは
  • を除きます.
  • フォーマットシステム上に穴を作製した.

  • すべての参照タイプにnullを割り当てることができるので、別の部分に展開すると、そのnullの意味も不明です.
  • Optionalクラス

  • java 8はハスクガスカラの影響でjavaです.util.Optionalという新しいクラスを提供します.
  • オプションは、選択値をカプセル化するクラスです.
  • は、값이 없을 수 있음を明確に示す.
  • オプションクラスを使用すると、モデルの意味がより明確になります.
  • オプションを最大1つの要素を持つ特別なStreamと考えれば良いのです.
  • オプションクラスとStreamクラスの間には直接的な実装または継承関係はありませんが、使用方法と基本思想は非常に似ています.

  • ソース

    Optionオブジェクトの作成


    空のオプション

  • 静的ファクトリメソッドオプション.空のオプションオブジェクトを取得できます.
  • Optional<Car> optCar = Optional.empty();
    
    private static final Optional<?> EMPTY = new Optional<>();

    Null以外の値でのオプションの作成

  • 静的ファクトリメソッドオプション.0以外の値を含むオプションを作成できます.
  • 入力
  • 係数の値がnullの場合、NPEは直ちに生成される.
  • Optional<Car> optCar = Optional.of(car);

    Null値を使用したオプションの作成

  • も静的ファクトリメソッドオプションです.ofNullableを使用してnull値を格納するオプションを作成できます.
  • パラメータの値がnullの場合、空のOptionalオブジェクトが返されます.
  • Optional<Car> optCar = Optional.ofNullable(car);

    mapを使用してオプションの値を抽出および変換

  • は、通常、オブジェクト情報を抽出する際にOptionを使用する.
  • String name = null;
    if(insurance != null){
        name = insurance.getName();
    }
    たとえば、
  • などの保険会社の名前を抽出するとします.次のコードのように名前情報にアクセスする前に、nullが保険されていることを確認する必要があります.
  • Optional<Insurance> optInsurance = Optional.ofNullable(insurance);
    Optional<String> name = optInsurance.map(Insurance::getName);
  • オプションは、マッピング方法をサポートし、このタイプのモードで使用することができる.
  • オプションのマッピングは概念的にStreamのマッピング方法と似ている.
  • オプションにこの値が含まれている場合、mapの引数として提供される関数はこの値を変更します.
  • 空いていて何も起こらない.
  • FlatMapを使用してOptionalオブジェクトを接続する

    public String getCarInsuranceName(Person person) {
        return person.getCar().getInsurance().getName();
    }
  • このコードはどのように利用されていますか?
  • Optional<Person> optPerson = Optional.of(Person);
    Optional<String> name = optPerson.map(Person::getCar).map(Car::getInsurance).map(Insurance::getName);
  • 上のコードはコンパイルされません.
  • optPerson.map(Person::getCar)
  • getCar戻りオプション
  • したがって,上記のコードの戻り値はOptionalタイプであり,getInsuranceメソッドはサポートされていない.
  • ストリームのように平面地図を利用して、2次元オプションを1級オプションとする標準化
  • public String getCarInsuranceName(Optional<Person> person) {
        return person.flatMap(Person::getCar).flatMap(Car::getInsurance).map(Insurance::getName).orElse("Unknown");
    }

    ドメインモデルでオプションを使用するときにデータをシリアル化できない理由

  • Optionalクラスはフィールドフォーマットを採用していないため、シリアルインタフェースは実現されていない.
  • したがって、ドメインモデルでOptionalを使用する場合、シリアルモデルを使用するツールやフレームワークに問題が発生する可能性があります.
  • モデルをシリアル化する必要がある場合は、変数を汎用オブジェクトとして使用し、オプションで値を返す方法を追加することをお勧めします.
  • public class Person {
    	private Car car;
    	public Optional<Car> getCarAsOptional() {
    		return Optional.ofNullable(car);
    	}
    }

    アクションオプションフロー

  • java 9では、Optionを含むストリームの処理を容易にするために、Optionにstream()メソッドが追加されています.
  • Streamで最も有用な関数チェーンの形式は次のとおりです.
  • Stream<Optional<String>> stream = ...;
    Set<String> result = stream.filter(Optional::isPresent)
        .map(Optional::get)
        .collect(toSet());

    分離アクションとオプションエンベロープ

    get
    これは
  • 値を読み取る最も簡単な方法であり、最も安全ではない方法でもある.
  • がない場合はNoSuchElementExceptionが起動し、値がない場合はgetメソッド
  • は使用しないでください.orElse
  • オプションに値が含まれていない場合は、デフォルト値を指定できます.
  • orElseGet(Supplier<? extends T> other)
  • またはElseメソッドに対応する怠惰バージョン.Supplierは、オプションに値がない場合にのみ実行されます.
  • のデフォルト値が必要な場合は
  • を使用します.orElseThrow(Supplier<? extends X> exceptionSupplier)
  • オプションが空の場合、例外が発生する可能性があり、発生する例外のタイプを決定できます.
  • ifPresent(Consumer<? super T> consumer)
  • の値がある場合、引数に渡す操作を実行できます.
  • の価格がなければ、何事も起こりません.
  • ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
  • Java 9
  • オプションが空の場合に実行されるRunnableは
  • を受け入れます.

    2つのオプションをマージ

  • オプションでは、mapおよびflatMapオプションが空の場合、empty Optionalが返されます.
  • の2つのオプションの演算は、マッピングとflatMapを使用して行うことができます.
  • 特定の値をフィルタ

  • 濾過方法はフレディケイトを買収として受け入れた.
  • オプションオブジェクトが値を有し、プリセット値と一致する場合、フィルタリング方法は値
  • を返します.
  • それ以外の場合は、空のオプションオブジェクト
  • を返します.

    Optionの使用例


    nullのターゲットをオプションで囲む

    Object value = map.get("key");
    Optional<Object> value = Optional.ofNullable(map.get("key"));
  • を参照するオブジェクトがnullである可能性がある場合は、Optionalオブジェクトで置き換えます.
  • 例外とオプションクラス

  • Java APIで値を指定できない場合、nullを返すのではなく、例外が発生することがあります.
  • は、この方法のためにオプションを返すようにモデリングすることができる.
  • public static Optional<Integer> stringToInt(String s) {
      try {
        return Optional.of(Integer.parseInt(s));
      } catch(NumberFormatException e) {
        return Optional.empty();
      } 
    }

    なぜ基本オプションを使用しないのですか?

  • オプションとともに、基本的な特化クラスOptionalInt、OptionalLong、OptionalDoubleが存在します.
  • ただし、オプションの最大要素数は1つしかないため、パフォーマンスは改善されません.
  • もmap、flatMap、filterなどをサポートしていないため、他の一般的なオプションと混合して使用できないため、デフォルトの既存のオプションは推奨されません.
  • 余分に考慮した部分

  • 学習グループのメンバーが見つけた部分:)
  • https://homoefficio.github.io/2019/10/03/Java-Optional-%EB%B0%94%EB%A5%B4%EA%B2%8C-%EC%93%B0%EA%B8%B0/