簡體   English   中英

如何從 object 返回一個可為空的列表,該列表可以是帶有流的 null

[英]How to return a nullable List from an object that can be null with streams

我有一個方法需要一個ArrayList

private List<String> getWatchlistDetail(MatchData k) {
        if(k == null)
            return new ArrayList<>();
        return
                k.getWatchListDetail()
                        .stream()
                        .collect(Collectors.toList());
    }

MatchData k可以是null ,有時k.getWatchListDetail()也可以是null

我需要檢查這兩個條件。 首先,它是否可以拋出 NPE。

上面的實現做到了,但我正在嘗試使用Optional.ofNullable()或帶有鏈接的流,所以我可以在一行鏈接中完成它。

MatchData k 是null ,有時k.getWatchListDetail()也是null所以我需要檢查兩者

...所以我可以在一行鏈接中完成。

當然,您可以在一個 stream 語句中檢查兩者。

private List<String> getWatchlistDetail(MatchData k) {
    
    return Stream.ofNullable(k)
        .map(MatchData::getWatchListDetail)
        .filter(Objects::nonNull)
        .flatMap(List::stream)
        .collect(Collectors.toList());
}

但是,請記住:

  • 這不是補救措施,而是試圖隱藏設計缺陷
  • 它有生成一個新的完全相同的集合的成本。 這一點都不好。

現在將它與下面的方法進行比較,它既不隱藏空值檢查,也不濫用流和可選的:

private List<String> getWatchlistDetail(MatchData k) {
    
    return k != null && k.getWatchListDetail() != null ?
           k.getWatchListDetail() : Collections.emptyList();
}

函數式編程在 Java 中被引入以降低代碼的復雜性,而不是相反,僅將它用於隱藏 null 檢查的目的不會讓你有任何問題。

就其本身而言,空檢查不是問題,而只是問題的一個指標。 為了解決這個問題,需要改進您的應用程序的設計。

或許使用Optional.ofNullable

關於是否可以使用 optional 來避免條件邏輯的問題,請查看@StuartMarks (JDK 開發人員)的回答

Optional 的主要用途如下:

Optional 旨在為庫方法返回類型提供一種有限的機制,其中明確需要表示“無結果”,並且為此使用 null 極有可能導致錯誤。

一個典型的代碼味道是,它不是使用方法鏈接來處理從某種方法返回的 Optional 的代碼,而是從可為 null 的東西創建一個 Optional以便鏈接方法避免條件

暫無
暫無

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

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