Κοινή χρήση τεχνολογίας

Ένα άρθρο για να κατανοήσετε το Προαιρετικό σε Java

2024-07-12

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

1. Εισαγωγή στο Προαιρετικό

Προαιρετική είναι μια νέα κλάση που εισήχθη στο java8 Το κύριο πρόβλημα που λύνει είναι το NullPointerException.
Μετάφραση του αρχικού κειμένου (μετάφραση Baidu, οι ελλείψεις μου στα αγγλικά): ένα αντικείμενο κοντέινερ, το οποίο μπορεί να περιέχει ή να μην περιέχει μη μηδενικές τιμές. Η isPresent() θα επιστρέψει true εάν η τιμή είναι παρούσα. Εάν δεν υπάρχει τιμή, το αντικείμενο θεωρείται κενό και η isPresent() επιστρέφει false.
Παρέχονται πρόσθετες μέθοδοι που εξαρτώνται από την παρουσία της περιεχόμενης τιμής, όπως orElse() (επιστρέφει την προεπιλεγμένη τιμή εάν η τιμή δεν υπάρχει) και ifPresent() (εκτελεί την ενέργεια όταν υπάρχει η τιμή).
Αυτή είναι μια κλάση που βασίζεται σε τιμές, οι προγραμματιστές θα πρέπει να αντιμετωπίζουν ίσες παρουσίες ως εναλλάξιμες και δεν πρέπει να χρησιμοποιούν στιγμιότυπα για συγχρονισμό, διαφορετικά μπορεί να προκύψει απρόβλεπτη συμπεριφορά. Για παράδειγμα, ο συγχρονισμός μπορεί να αποτύχει σε μελλοντική έκδοση.

Η βασική λειτουργία που καταλαβαίνω εδώ είναι ότι μπορείτε να περάσετε isPresent() μέθοδος για να βοηθήσει στην κρίση του κενού του αντικειμένου και στη συνέχεια να περάσειmap(), orElse()ifPresent() Ο συνδυασμός άλλων μεθόδων μπορεί να μειώσει σημαντικά τη μακρά κρίση στον κώδικα.

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) Δύο παράμετροι, η πρώτη εκτελείται όταν δεν είναι κενή και η δεύτερη όταν είναι άδεια. Είναι όλες λειτουργίες διεπαφής.
Optional<T> filterΈνα φίλτρο για αντικείμενα
Optional<U> map(Function)Μέθοδος μετατροπής
Optional<U> flatMap(Function)Μέθοδος μετατροπής, που χρησιμοποιείται συνήθως με μετατροπή πολλαπλών επιπέδων σε ένα στρώμα
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: Καταλαβαίνω ότι αυτή η μέθοδος είναι μετατροπή unboxing: Για παράδειγμα, βάλε 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, παρέχει έναν πιο κομψό και ασφαλή τρόπο χειρισμού δυνητικά μηδενικών τιμών.Κυρίως μέσωor ,orElse , ifPresent Αναμένοντας λειτουργικές μεθόδους για τον κομψά προσδιορισμό του κενού χώρου και εκτέλεση της λειτουργίας αφού δεν είναι κενός, αυτό μπορεί να μειώσει πολλαπλά επίπεδαif Η κρίση κάνει τον κώδικα κομψό, αλλά τα μειονεκτήματα είναι函数式 μέθοδος θα μειώσει την αναγνωσιμότητα του κώδικα.και επίσης πρέπειLambda Χρειάζεται ένα ορισμένο βαθμό κατανόησης.