Java 8 Streamsを使用してリストが空の場合、デフォルトのリストを返しますか?


9

以下がストリーム操作の1つのセットとして実行できるようにする方法はありますか?recommendedProductsが空であるかどうかを明示的にチェックせずにデフォルトのリストを返す、またはフィルターされたリストを返しますか?

public List<Product> getRecommendedProducts() {
    List<Product> recommendedProducts 
        = this.newProducts
              .stream()
              .filter(isAvailable)
              .collect(Collectors.toList());

    if (recommendedProducts.isEmpty()) {
        return DEFAULT_PRODUCTS;
    }

    return recommededProducts;
}

4
既存のコードの何が問題になっていますか?
アンディターナー

@AndyTurner同意する。コードはそのままです。私が行う唯一の改善は、if-elseステートメントの代わりに三項演算子を使用することです。それはまだ好みの問題です。
ETO

@ETO何も問題はありませんが、明示的な条件チェックなしでStream APIを使用するだけでそれを行う方法があるかどうかを確認しようとしていました。返信ありがとう-三項演算子の提案が好きです。
user3495691

回答:


5

あなたはこれを試すことができます:

List<Product> recommendedProducts 
        = this.newProducts
              .stream()
              .filter(isAvailable)
              .collect(Collectors.collectingAndThen(Collectors.toList(), list -> list.isEmpty() ? DEFAULT_PRODUCTS : list));

5

を使用して目標を達成することはできますがOptional、私はまだ古い三項演算子を選択します。

この特定のケースでは、それははるかに意味があり、読みやすさが向上します。

return recommendedProducts.isEmpty() ? DEFAULT_PRODUCTS : recommendedProducts;

4

はい Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.