簡體   English   中英

Java 8可選類:如果可為空,則返回值

[英]Java 8 Optional-class: return value if nullable

我正在嘗試將現有的代碼片段轉換為一些精美的Java 8單行代碼。

private static final Map<Integer, Foo> FOO_MAP = ...

public static Foo getForCode(final Integer code) {

  if (code == null) {
    return null;
  }

  final Foo foo = FOO_MAP.get(code);
  if (foo== null) {
    throw new IllegalStateException("Unknown foo for code: " + code);
  }

  return foo;
}

到目前為止,我的解決方案缺少對參數為null的處理。

public static Foo getForCode(final Integer code) {
  return Optional.ofNullable(code).map(FOO_MAP::get)
        .orElseThrow(() -> new IllegalStateException("Unknown foo for code: " + code));
}

在不更改原始函數行為的情況下,我認為Optional在這里不會給您帶來任何好處,只是有機會在其方法和lambda中埋入一些復雜的條件。 如果要使用if語句和布爾表達式來最小化條件表達式,則最終會得到以下結果:

Foo getForCode(Integer code) {
    Foo foo = null;
    if (code == null || (foo = FOO_MAP.get(code)) != null) {
        return foo;
    } else {
        throw new IllegalStateException("Unknown foo for code: " + code);
    }
}

在我看來,這比使用Optional任何解決方案更具可讀性,盡管它仍然很模糊。

如果您願意更改函數的語義並返回Optional ,那么Roshane Perera建議似乎是一種合理的方法(+1)。

您可以從getForCode(final Integer code)返回Optional<Foo> ,並讓客戶端處理返回的可選值。

public static Optional<Foo> getForCode(final Integer code) {
        return Optional.ofNullable(code).map(FOO_MAP::get);
}

它不是很可讀,但是您可以:

Foo result = Optional.ofNullable(code)
            .map(x -> Optional.ofNullable(FOO_MAP.get(x))
                              .orElseThrow(() -> new IllegalStateException("Unknown foo for code: " + code)))
            .orElse(null);

您可以先單獨處理。
嘗試將兩種情況混合在一個語句中可能會降低其可讀性。

請注意,實際上您可能不需要使用Optional
Optional對於返回類型更有意義。 在您的實際代碼中,您繼續返回null值。

這是Optional的用法,您返回Optional來處理兩種情況:返回的Foo和沒有返回的Foo

public static Optional<Foo> getForCode(final Integer code) {
    if (code == null)
        return Optional.empty();

    Optional<Foo> optional = Optional.ofNullable(map.get(code));
    if (!optional.isPresent()) {
        throw new IllegalStateException("Unknown foo for code: " + code);
    }
    return optional;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM