week9_incheol_1 - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

Optional์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ ์„ค๋ช…๊ณผ ์˜ˆ์‹œ๋ฅผ ์„ค๋ช…ํ•ด๋ณด์‹œ์˜ค

Optional ๊ฐ์ฒด ์ƒ์„ฑ

  • Optional.of

    value๊ฐ€ null ์ผ ๊ฒฝ์šฐ NPE ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

    Optional<City> city = Optional.of(city);
  • Optional.ofNullable

    value๊ฐ€ null์ธ ๊ฒฝ์šฐ ๋น„์–ด์žˆ๋Š” Optional์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    Optional<City> city = Optional.ofNullable(city);
  • Optional.isEmpty

    ๋น„์–ด์žˆ๋Š” Optional ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    Optional<City> city = Optional.isEmpty();

Optional ์ค‘๊ฐ„์ฒ˜๋ฆฌ

  • filter

    predicate ๊ฐ’์ด ์ฐธ์ด๋ฉด ํ•ด๋‹น ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๊ณ  ๊ฑฐ์ง“์ด๋ฉด ๋น„์–ด์žˆ๋Š” Optional ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    return Optional.ofNullable(address)
                     .filter(a -> a.getStreet().contains("seoul"))
                     .map(Address::getStreet)
                     .orElse("incheol");
  • map

    ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

    return Optional.ofNullable(city)
                     .map(City::getAddress)
                     .map(Address::getZipcode)
                     .map(Zipcode::getCode)
                     .orElse("incheol");
  • flatMap

    map๊ณผ ๋™์ผํ•˜์ง€๋งŒ ๋ณ€ํ™˜๋œ ๊ฐ’์„ Optional๋กœ ๊ฐ์‹ธ์ฃผ๋Š”๊ฒŒ ์ฐจ์ด๋‹ค.

    return Optional.ofNullable(city)
                     .flatMap(City::getAddress)
                     .flatMap(Address::getZipcode)
                     .flatMap(Zipcode::getCode)
                     .orElse("incheol");

Optional ์ข…๋‹จ์ฒ˜๋ฆฌ

  • ifPresent

    ๊ฐ’์ด null์ด ์•„๋‹ˆ๋ผ๋ฉด ์‹คํ–‰ํ•œ๋‹ค.

    City city = new City("seoul");
    Optional.ofNullable(city).ifPresent(i -> System.out.println(i.getName()));
  • isPresent

    ๊ฐ’์ด null ์ธ์ง€ ์•„๋‹Œ์ง€ ์—ฌ๋ถ€๋งŒ ํ™•์ธํ•œ๋‹ค.

    if(Optional.ofNullable(city).isPresent()){
    	System.out.println(i.getName())
    }
  • get

    Optional ์‹ค์ œ ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค. ์—†์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

    City city = Optional.ofNullable(city).get()
  • orElse

    Optional ๊ฐ์ฒด๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด ๋ฆฌํ„ดํ•  ๊ฐ’์„ ์ •ํ•ด์ค€๋‹ค. (๋ฌด์กฐ๊ฑด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•จ์œผ๋กœ ์‹คํ–‰์‹œ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ์€ ํ”ผํ•ด์•ผ ํ•œ๋‹ค)

    return Optional.ofNullable(city)
                     .map(City::getName)
                     .orElse(printTest());
  • orElseGet

    Optional ๊ฐ์ฒด๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด ๋ฆฌํ„ดํ•œ ๊ณต๊ธ‰์ž ํ•จ์ˆ˜(Supplier)๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. (๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰๋จ)

    return Optional.ofNullable(city)
                .map(City::getName)
                .orElseGet(() -> printTest());
  • orElseThrow

    Optional ๊ฐ์ฒด๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

    return Optional.ofNullable(city)
                     .map(City::getName)
                     .orElseThrow(Exception::new);

java 9

  • or

    orElseGet๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ค‘๊ฐ„์— ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ ์„ค์ •ํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    Address notEmptyAddress = new Address("seongnam");
    Address notEmptyAddress2 = new Address("daegue");
    
    // ๋ฆฌํ„ด๊ฐ’ : seongnam
    return Optional.ofNullable(address)
                     .filter(a -> a.getStreet().contains("seoul"))
    							   .or(Optional::empty)
                     .or(() -> Optional.ofNullable(notEmptyAddress))
                     .or(() -> Optional.ofNullable(notEmptyAddress2));
    
    // ๋ฆฌํ„ด๊ฐ’ : daegue
    return Optional.ofNullable(address)
                   .filter(a -> a.getStreet().contains("seoul"))
                   .or(() -> Optional.ofNullable(notEmptyAddress2))
                   .or(() -> Optional.ofNullable(notEmptyAddress));
  • ifPresentOrElse

    ifPresent์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๊ฐ’์ด ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ์™€ ๋น„์–ด์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ชจ๋‘๋ฅผ ํ•œ๋ฒˆ์— ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

    // ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜
    public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction);
    // ์˜ˆ์ œ
    Optional.ofNullable("test")
        .ifPresentOrElse(value -> System.out.println(value), () -> System.out.println("null")); // print 'test'
    Optional.ofNullable(null)
        .ifPresentOrElse(value -> System.out.println(value), () -> System.out.println("null")); // print 'null'
  • stream

    ์˜ต์…”๋„ ๊ฐ์ฒด๋ฅผ ์ŠคํŠธ๋ฆผ ๊ฐ์ฒด๋กœ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    // ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜
    public Stream<T> stream();
    // ์˜ˆ์ œ
    List<String> result = List.of(1, 2, 3, 4)
        .stream()
        .map(val -> val % 2 == 0 ? Optional.of(val) : Optional.empty())
        .flatMap(Optional::stream)
        .map(String::valueOf)
        .collect(Collectors.toList());
    System.out.println(result); // print '[2, 4]'

java 10

  • orElseThrow

    ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”์—†๋Š” ์˜ˆ์™ธ ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

    // ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜
    public T orElseThrow();
    // ์˜ˆ์ œ (์ž๋ฐ” 8)
    Optional.ofNullable(something).orElseThrow(NoSuchElementException::new);
    // ์˜ˆ์ œ (์ž๋ฐ” 10)
    Optional.ofNullable(something).orElseThrow();
โš ๏ธ **GitHub.com Fallback** โš ๏ธ