Teknologian jakaminen

Yksi artikkeli Valinnaisen ymmärtämiseksi Javassa

2024-07-12

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

1. Valinnaisen esittely

Valinnainen on uusi luokka, joka esiteltiin java8:ssa. Pääongelma, jonka se ratkaisee, on NullPointerException.
Alkuperäisen tekstin käännös (Baidu-käännös, minun puutteet englanniksi): säiliöobjekti, joka voi sisältää tai ei sisällä ei-nolla-arvoja. isPresent() palauttaa tosi, jos arvo on olemassa. Jos arvoa ei ole, objektia pidetään tyhjänä ja isPresent() palauttaa false.
Lisämenetelmiä tarjotaan, jotka riippuvat sisällytetyn arvon olemassaolosta, kuten orElse() (palauttaa oletusarvon, jos arvoa ei ole) ja ifPresent() (suorittaa toiminnon, kun arvo on läsnä).
Tämä on arvopohjainen luokka, jonka ohjelmoijien tulisi käsitellä samanarvoisia esiintymiä keskenään vaihdettavina, eikä niitä tule käyttää synkronointiin, sillä muuten voi esiintyä odottamatonta toimintaa. Synkronointi voi esimerkiksi epäonnistua tulevassa julkaisussa.

Ymmärrän tässä, että voit läpäistä isPresent() menetelmä auttaa arvioimaan objektin tyhjyyttä ja sitten läpäisemäänmap(), orElse()ifPresent() Muiden menetelmien yhdistelmä voi huomattavasti vähentää koodin pitkiä arvioita.

2. Yleisesti käytetyt rajapinnat

先介绍一下常用所有的接口;
注意:
	1. 此列表是列出了本人觉得有意义的接口不是全部。
	2. 当前jdk版本为17,其他版本可能会没有一些方法,例如:`or()` 方法在jdk1.9中增加的
  • 1
  • 2
  • 3
  • 4
Käyttöliittymän nimiLyhyt kuvaus toiminnasta
Optional<T> empty()Rakenna tyhjäOptional esine
Optional<T> of(T value)Rakenna ei-tyhjäOptional vastusta jos为空则报错
Optional<T> ofNullable(T value)rakentaaOptional Objekti, saa olla tyhjä!
T get()Hanki yleinen objektin arvo, jos arvo为空,则报错
boolean isPresent()Tyhjä jos einull Sitten se ontrue
boolean isEmpty()Tyhjä josnull Sitten se ontrue
ifPresent(Consumer)Pass käyttöliittymän toimintopari, kun tiedot不为空Tämä toiminto suoritetaan, kun
ifPresentOrElse(Consumer, Runnable) Kaksi parametria, ensimmäinen suoritetaan, kun se ei ole tyhjä, ja toinen suoritetaan, kun se on tyhjä. Ne ovat kaikki käyttöliittymätoimintoja.
Optional<T> filterSuodatin esineille
Optional<U> map(Function)Muunnosmenetelmä
Optional<U> flatMap(Function)Muunnosmenetelmä, jota käytetään yleisesti monikerroksisessa muuntamisessa yhdeksi tasoksi
Optional<T> or(Supplier)Kun hankit esineen为空Kun luot uuden käyttöliittymätoiminnon perusteellaOptionalesine
T orElse(T)Kun hankit esineen为空Hanki määritetty yleinen objekti milloin
T orElseThrow()不为空 Palauta esine,为空 muttaNoSuchElementException
T orElseThrow(Supplier)不为空 Palauta esine,为空 mutta指定异常

2.1 Yleisiä käyttöliittymiä on helppo käyttää

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

2.1.1 Yleiset luomismenetelmät

// 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 Yleiset menetelmät arvojen saamiseksi


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 Yleiset arviointimenetelmät

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 Toimintatapa tuomion jälkeen


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 Johdatus karttamenetelmään

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 Muut menetelmät

Muut menetelmät:

2.2.1 Suodatusmenetelmä

filter : Tämä menetelmä on tarkoitettu suodatukseen,Optional<Path> p = uris. stream().filter(uri -> !isProcessedYet(uri)).findFirst() .map(Paths::get); En ole periaatteessa koskaan käyttänyt sitä täällä, ja tuntuu, että käyttöskenaariota ei ole.

2.2.2 FlatMap-menetelmä

flatMap: Ymmärrän tämän menetelmän muunnospakkauksen purkamiseksi: Esimerkiksi laita Stream<Optional<T>> MuuntaaOptional<T>

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

3. Yleisesti käytetyt esimerkit

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

4. Yhteenveto

Optional Java 8:ssa esitelty se tarjoaa tyylikkäämmän ja turvallisemman tavan käsitellä mahdollisia nolla-arvoja.Pääasiassa läpior ,orElse , ifPresent Odottaessa toiminnallisia menetelmiä, jotka määrittävät tyylikkäästi tyhjän tilan ja suorittavat toiminnon sen jälkeen, kun se ei ole tyhjä, tämä voi vähentää useitaif Tuomio tekee koodista tyylikkään, mutta haittoja ovat函数式 menetelmä heikentää koodin luettavuutta.ja myös tarvitseeLambda Se vaatii jonkin verran ymmärrystä.