![](/img/trans.png)
[英]Is there an elegant way to initialize and return value of nullable field using Optional
[英]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.