Berbagi teknologi

Satu artikel untuk memahami Opsional di Java

2024-07-12

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

1. Pengantar Opsional

Opsional adalah kelas baru yang diperkenalkan di java8. Masalah utama yang dipecahkannya adalah NullPointerException.
Terjemahan teks asli (terjemahan Baidu, kekurangan saya dalam bahasa Inggris): objek wadah, yang mungkin mengandung nilai bukan nol atau tidak. isPresent() akan mengembalikan nilai true jika nilainya ada. Jika tidak ada nilai, objek dianggap kosong dan isPresent() mengembalikan nilai salah.
Metode tambahan disediakan yang bergantung pada keberadaan nilai yang terkandung, seperti orElse() (mengembalikan nilai default jika nilai tidak ada) dan ifPresent() (melakukan tindakan saat nilai ada).
Ini adalah kelas berbasis nilai; pemrogram harus memperlakukan instance yang sama sebagai sesuatu yang dapat dipertukarkan dan tidak boleh menggunakan instance untuk sinkronisasi, jika tidak, perilaku yang tidak terduga dapat terjadi. Misalnya, sinkronisasi mungkin gagal pada rilis mendatang.

Fungsi inti yang saya pahami di sini adalah Anda bisa lulus isPresent() metode untuk membantu dalam menilai kekosongan objek, dan kemudian lulusmap(), orElse()ifPresent() Kombinasi metode lain dapat sangat mengurangi panjang penilaian dalam kode.

2. Antarmuka yang umum digunakan

先介绍一下常用所有的接口;
注意:
	1. 此列表是列出了本人觉得有意义的接口不是全部。
	2. 当前jdk版本为17,其他版本可能会没有一些方法,例如:`or()` 方法在jdk1.9中增加的
  • 1
  • 2
  • 3
  • 4
Nama antarmukaDeskripsi singkat tentang fungsi
Optional<T> empty()Buatlah yang kosongOptional obyek
Optional<T> of(T value)Buatlah yang tidak kosongOptional keberatan jika为空则报错
Optional<T> ofNullable(T value)membangun sebuahOptional Obyek, boleh kosong!
T get()Dapatkan nilai objek generik, jika nilainya为空,则报错
boolean isPresent()Kosong jika tidaknull Maka itu benartrue
boolean isEmpty()Kosong jikanull Maka itu benartrue
ifPresent(Consumer)Lewati pasangan fungsi antarmuka, saat data不为空Fungsi ini dijalankan ketika
ifPresentOrElse(Consumer, Runnable) Dua parameter, yang pertama dijalankan jika tidak kosong, dan yang kedua dijalankan jika kosong. Itu semua adalah fungsi antarmuka.
Optional<T> filterFilter untuk objek
Optional<U> map(Function)Metode konversi
Optional<U> flatMap(Function)Metode konversi, biasa digunakan dengan konversi multi-layer menjadi satu layer
Optional<T> or(Supplier)Saat mendapatkan objeknya为空Saat membuat yang baru berdasarkan fungsi antarmukaOptionalobyek
T orElse(T)Saat mendapatkan objeknya为空Dapatkan objek generik tertentu kapan
T orElseThrow()不为空 Kembalikan objek,为空 TetapiNoSuchElementException
T orElseThrow(Supplier)不为空 Kembalikan objek,为空 Tetapi指定异常

2.1 Antarmuka umum mudah digunakan

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

2.1.1 Metode umum pembuatan

// 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 Metode umum untuk memperoleh nilai


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 Metode penilaian yang umum

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 Metode operasi setelah penilaian


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 Pengenalan metode peta

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 Metode lainnya

Metode lain:

2.2.1 Metode penyaring

filter : Metode ini untuk memfilter,Optional<Path> p = uris. stream().filter(uri -> !isProcessedYet(uri)).findFirst() .map(Paths::get); Saya pada dasarnya belum pernah menggunakannya di sini, dan sepertinya tidak ada skenario penggunaan.

2.2.2 Metode FlatMap

flatMap: Saya memahami metode ini sebagai konversi unboxing: Misalnya, masukkan Stream<Optional<T>> Ubah keOptional<T>

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

3. Contoh yang umum digunakan

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

4. Ringkasan

Optional Diperkenalkan di Java 8, ini menyediakan cara yang lebih elegan dan aman untuk menangani potensi nilai null.Terutama melaluior ,orElse , ifPresent Menunggu metode fungsional untuk menentukan ruang kosong dengan elegan dan menjalankan operasi setelah ruang tersebut tidak kosong, hal ini dapat mengurangi banyak lapisanif Penghakiman membuat kode menjadi elegan, namun kelemahannya adalah函数式 metode ini akan mengurangi keterbacaan kode.dan juga perluLambda Dibutuhkan sejumlah pemahaman.