技術共有

Java のオプションを理解するための 1 つの記事

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. オプションの概要

オプションは Java8 で導入された新しいクラスです。これにより解決される主な問題は NullPointerException です。
原文の翻訳 (Baidu の翻訳、英語の私の欠点): コンテナ オブジェクト。null 以外の値が含まれる場合と含まれない場合があります。 isPresent() は、値が存在する場合に true を返します。値がない場合、オブジェクトは空とみなされ、isPresent() は false を返します。
orElse() (値が存在しない場合にデフォルト値を返す) や ifPresent() (値が存在する場合にアクションを実行する) など、含まれる値の存在に依存する追加のメソッドが提供されます。
これは値ベースのクラスであるため、プログラマは等しいインスタンスを交換可能として扱い、同期にインスタンスを使用しないでください。そうしないと、予期しない動作が発生する可能性があります。たとえば、将来のリリースでは同期が失敗する可能性があります。

私がここで理解している中心的な機能は、次のことを渡すことができるということです。 isPresent() オブジェクトが空であるかどうかの判断を支援するメソッドを渡します。map(), orElse()ifPresent() 他のメソッドを組み合わせると、コード内の長い if 判定を大幅に短縮できます。

2. よく使用されるインターフェース

先介绍一下常用所有的接口;
注意:
	1. 此列表是列出了本人觉得有意义的接口不是全部。
	2. 当前jdk版本为17,其他版本可能会没有一些方法,例如:`or()` 方法在jdk1.9中增加的
  • 1
  • 2
  • 3
  • 4
インターフェース名機能の簡単な説明
Optional<T> empty()空のオブジェクトを構築するOptional 物体
Optional<T> of(T value)空でないものを構築するOptional もし反対するなら为空则报错
Optional<T> ofNullable(T value)を建てるOptional オブジェクト、空であっても構いません!
T get()値が次の場合、汎用オブジェクト値を取得します。为空,则报错
boolean isPresent()そうでない場合は空null それならそうですtrue
boolean isEmpty()空の場合null それならそうですtrue
ifPresent(Consumer)データが送信されるとき、インターフェイス関数のペアを渡します。不为空この関数は次の場合に実行されます。
ifPresentOrElse(Consumer, Runnable) 2 つのパラメーター。最初のパラメーターは空でない場合に実行され、2 番目のパラメーターは空の場合に実行されます。これらはすべてインターフェイス関数です。
Optional<T> filterオブジェクト用のフィルター
Optional<U> map(Function)変換方法
Optional<U> flatMap(Function)マルチレイヤーを 1 レイヤーに変換する場合によく使用される変換方法
Optional<T> or(Supplier)オブジェクトを取得するとき为空インターフェース機能をもとに新規作成する場合Optional物体
T orElse(T)オブジェクトを取得するとき为空次の場合に指定されたジェネリック オブジェクトを取得します。
T orElseThrow()不为空 オブジェクトを返す、为空 しかしNoSuchElementException
T orElseThrow(Supplier)不为空 オブジェクトを返す、为空 しかし指定异常

2.1 共通インターフェースは使いやすい

下面是常用接口的一些简单的演示
  • 1

2.1.1 一般的な作成方法

// 1. 构建一个空的 Optional 对象没有任何问题
Optional<Object> empty = Optional.empty();

 // 2. 构建一个非空的 Optional 对象没有任何问题
 Optional<Object> aa = Optional.of("123");
 // 3. 构建一个空的 Optional 对象直接报错  ================ 会报错 of不允许为空
 Optional<Object> bb = Optional.of(null);

 // 4. 构建一个空的 Optional 对象没有任何问题
 Optional<Object> cc = Optional.ofNullable(null);

 // 5. 构建一个非空的 Optional 对象没有任何问题
 Optional<Object> dd = Optional.ofNullable("123");

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.1.2 値を取得する一般的な方法


Optional<Object> cc = Optional.ofNullable(null);
// 1. 如果为空的时候获取值就会直接报错
Object o = cc.get();
// 2. 如果对象为空,则获取 or 中的 get 方法的值,否则则获取cc的 get 方法中的值
Object o1 = cc.or(() -> Optional.ofNullable("123")).get();
// 3. 如果对象为空,则直接获取的是 123, orElse()中的参数是非空的。 如果对象不为空则直接获取到对象的值
Object o2 = cc.orElse("123");
// 4. 如果对象为空,则获取 or 中的 get 方法的值,否则则获取cc的 get 方法中的值
Object o3 = cc.orElseGet(() -> Optional.ofNullable("123"));

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.1.3 一般的な判断方法

Optional<Object> cc = Optional.ofNullable(null);
// 1. 存在则返回true
boolean present = cc.isPresent();
// 2. 为null返回true
boolean empty = cc.isEmpty();
  • 1
  • 2
  • 3
  • 4
  • 5

2.1.4 判定後の操作方法


Optional<Object> cc = Optional.ofNullable(null);
// 1. 如果对象不为空,则执行方法体的内容,否则没有任何操作
cc.ifPresent(item->{
    System.out.println("不为空则执行我"+item);
});

// 2. 如果对象不为空,则执行方法体的内容,否则没有任何操作
cc.ifPresentOrElse(item->{
    System.out.println("不为空则执行我"+item);
},()->{
    System.out.println("为空则执行我");
});

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.2 マップメソッドの概要

map 方法的使用跟 Stream 中的map方法一样,我的理解这里面的所有的接口方法与 Stream 中重名的用法都是一样的
  • 1

@Data
public static class User{
    private String name;
    private Integer age;
}
@Test
void getMapTest(){

    User user = new User();
    user.setName("123");
    Optional<User> optionalUser = Optional.of(user);
    // 1. 直接获取 user 对象的 name 的值,这里 map 是当用户不为空的时候执行的
    Optional<String> name = optionalUser.map(User::getName);
    System.out.println(name.isEmpty()); // 输出 false

    Optional<User> optionalUser2 = Optional.ofNullable(null);
    // 2. 直接获取 user 对象的 name 的值,这里 map 是当用户不为空的时候执行的
    Optional<String> name2 = optionalUser2.map(User::getName);
    System.out.println(name2.isEmpty()); // 输出 true
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

2.2 その他の方法

その他の方法:

2.2.1 フィルタ方法

filter : このメソッドはフィルタリング用です。Optional<Path> p = uris. stream().filter(uri -> !isProcessedYet(uri)).findFirst() .map(Paths::get); ここでは基本的に使ったことがなく、利用シーンが無い感じです。

2.2.2 FlatMap メソッド

flatMap: このメソッドはアンボックス化変換であると理解しています: たとえば、次のようにします。 Stream<Optional<T>> に変換Optional<T>

Stream<Optional<T>> os = ....
Stream<T> s = os.flatMap(Optional::stream)
  • 1
  • 2

3. よく使用される例

TODO 这里后面再不吧,暂时也没有太合适的例子
  • 1

4. まとめ

Optional Java 8 で導入され、null の可能性のある値を処理するためのより洗練された安全な方法が提供されます。主にor ,orElse , ifPresent 関数メソッドが空のスペースを適切に判断し、空でなくなった後に操作を実行するのを待つことで、複数のレイヤーを削減できます。if 判断によりコードはエレガントになりますが、デメリットは次のとおりです。函数式 このメソッドはコードの可読性を低下させます。そしてまた必要がありますLambda ある程度の理解が必要です。