Javaの関数プログラミング:機能的なスタイルへのforループのif-elseラダー内部を変換する方法は?

ゴパルS Akshintala:

期待が導出3つのリストでitemIsBothaItemsbItems入力リストからitems機能的なスタイルに以下のようなコードを変換する方法?(私は、このコードは必要不可欠なスタイルで明らかに十分であるが、私は知りたいの宣言的なスタイルは、本当にこのような単純な例に対処するために失敗しない理解します)。ありがとうございました。

for (Item item: items) {
    if (item.isA() && item.isB()) {
        itemIsBoth.add(item);
    } else if (item.isA()) {
        aItems.add(item);
    } else if (item.isB()){
        bItems.add(item)
    }
}
SDJ:

質問のタイトルは非常に幅広い(変換した場合、他のはしご)ですが、実際の問題は、特定のシナリオについて質問するので、少なくとも缶が何ができるかを示していることに私はサンプルを提供してみましょう。

のでif-else構造がアイテムに適用される述語に基づいて3つの別個のリストを作成し、我々はグループ化操作として、より宣言的にこの動作を表現することができます。唯一の余分なタグ付けオブジェクトを使用して複数のブーリアン述語を折りたたむことであろう箱のうち、この作業を行うために必要。例えば:

class Item {
    enum Category {A, B, AB}

    public Category getCategory() {
        return /* ... */;
    }
}

その後、ロジックは、単にのように表すことができます。

Map<Item.Category, List<Item>> categorized = 
    items.stream().collect(Collectors.groupingBy(Item::getCategory));

各リストは、そのカテゴリ指定されたマップから検索することができる場所。

それは変更クラスにできない場合はItem、同様の効果が特大列挙宣言と分類方法を移動させることによって達成することができるItem(この方法は、静的な方法となる)クラス。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=229452&siteId=1