Item 55製品の返却はご遠慮ください
16039 ワード
Java 8の前:メソッドがいくつかの条件で値を返すことができない場合、選択できます.
二つの方法の欠点
これも根本的な原因であり,nullを返す実際の原因とは全く関係のないコードにある.
Javaバージョンが8にアップグレードされるにつれて、また2つの選択肢が現れました.
主人公はオプショナル
null以外のTタイプ参照を含めるか、何も含まないことができます.
何も装わない見張り先鋒が「空いた」と言った.
逆に、一部の価値観の傍観者は「暇がない」と言っている.
守望パイオニアは、最大1つの要素を持つことができる「不変」コレクションです.
OptionalではCollectionは実現していませんが、原則としてはそうです.
通常、Tを返す必要がありますが、いくつかの条件で何も返す必要がない場合は、Tではなく戻るオプションを宣言できます.
有効な戻り値がない場合は、空の結果を返す方法が作成されます.
傍観者の戻り方の利点
public static <E extends Comparable<E>> E max(Collection<E> c) {
if (c.isEmpty())
throw new IllegalArgumentException("빈 컬렉션");
E result = null;
for (E e : c)
if (result == null || e.compareTo(result) > 0)
result = Objects.requireNonNull(e);
return result;
}
このメソッドに空のコレクションを渡すと、EllegalArgumentExceptionが放出されます.コード55−2の集合では、最小値を求めることによりOptionalに戻る.
public static <E extends Comparable<E>> Optional<E> max(Collection<E> c) {
if (c.isEmpty())
return Optional.empty();
E result = null;
for (E e : c)
if (result == null || e.compareTo(result) > 0)
result = Objects.requireNonNull(e);
return Optional.of(result);
}
適切な静的ファクトリを使用して外部環境を生成すればよい.2つの仕様があります.
ストリームのエンドツーエンド計算では、多くの操作が返されます.
上記の最大メソッドをストリームバージョンに再作成
コード55-3のセットから最適値を取得し、オプション-ストリームバージョンを返す
public static <E extends Comparable<E>> Optional<E> max(Collection<E> c) {
return c.stream().max(Comparator.naturalOrder());
}
選択を終了する基準は?String lastWordInLexicon = max(words).orElse("단어 없음...");
Toy myToy = max(toys).orElseThrow(TemperTantrumException::new);
仮定値は常にコード55−6は、外部3−仮定値を用いて常に満タンである.
Element lastNobleGas = max(Elements.NOBLE_GASES).get();
デフォルト値を設定する費用が多く負担になる場合があります.この場合、Supplierを引数としてORElseGetを使用すると、最初に値が必要なときにSupplierを使用して作成でき、初期設定コストを削減できます.
より特殊な使い方→filter、map、flatMap、ifPresent
まだ適切な方法が見つからない場合は、isPresentメソッドを参照してください.
親プロセスのプロセスIDを出力するか、親プロセスがない場合は「N/A」のコードを出力します.
Java 9で紹介されているProcessHandleクラスを使用しています.
Optional<ProcessHandle> parentProcess = ph.parent();
System.out.println("부모 PID: " + (parentProcess.isPresent() ? String.valueOf(parentProcess.get().pid()) : "N/A"));
このコードはOptionalのmapを使用して次のように調整できます.System.out.println("부모 PID: + ph.parent().map(h -> String.valueOf(h.pid())).orElse("N/A"));
Streamを使用すれば、StreamJava 8では、次のように実装されます.
streamOfOptionals.filter(Option::isPresent)
.map(Optional::get)
ご覧のように、傍観者が値(Optional::isPreset)→値を取り出して(Optional::get)ストリームにマッピングする場合Java 9は、Optionにstream():OptionをStreamに変換するアダプタを追加します.
傍観者に値がある場合は、その値を要素のストリームに変換し、値がない場合は空のストリームに変換します.
StreamのFlatMapメソッドと組み合わせると、前のコードを次のように変更できます.
streamOfOptionals.flatMap(Optional::stream)
コレクション、ストリーム、排出、受取などのコンテナタイプは受取小包ではいけません.空のオプション
- を返すよりも、空のリストを返します.
空のコンテナをそのまま返すと、クライアントに外部処理コードを入れる必要はありません.
メソッドの戻りタイプをTではなくOptionalと宣言します。
ミシンを入れた基本タイプのチョッキは、基本タイプ自体よりも重いしかありません.
価格は2階建てですから.
そこでJava APIデザイナーはint,long,double専用の外部クラスを用意した.
→ OptionalInt, OptionalLong, OptionalDouble
このような代替材料がある以上、ミシンの基本タイプが入ったゴーグルは返却しないでください.
(Boolean、Byte、Character、Short、Floatを除く)
傍観者は、集合のキー、値、要素、または配列の要素として使用するのにほとんど適していません.
コアの整理
Reference
この問題について(Item 55製品の返却はご遠慮ください), 我々は、より多くの情報をここで見つけました https://velog.io/@wlghsp/Item-55-옵셔널-반환은-신중히-하라テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol