2017-11-02 1 views
2

リストがあり、リスト内の各項目について、各リスト要素に基づいて「何か」する必要があります。Java 8 - ループ内にネストされている場合

リストはコードで構成され、合計5つのコードがあります。リストには、任意のコードまたはすべてのコードを含めることができます。

これまでのところ私はforEachのを使用しましたし、以下のように私はそれの内側であれば条件を書いた - 私はこれをリファクタリングで探しています

List<Category> categories = getCategories(); 

categories.stream().forEach(category -> { 
      if(category.equals(Category.A)) { 
       // do something 
      } else if(category.equals(Category.B)) { 
       // do something 
      } else if(category.equals(Category.C)) { 
       // do something 
      } else if(category.equals(Category.D)) { 
       // do something 
      } else if(category.equals(Category.E)) { 
       // do something 
      } 
     }); 

。誰かがこれをいかにうまくいくか見てみることができますか?私は改善するだろう

+4

すべてのカテゴリが上書きして、単純に 'category.doSomething()'と書くというメソッド 'void doSomething()'に 'something do'を入れることができます。 – luk2302

+2

ループテーブルを作成します。情報については、[この質問](https://stackoverflow.com/questions/4480334/how-to-call-a-method-stored-in-a-hashmap-java)を参照してください。 – pritaeas

+2

どのような比較が 'category.equals(Category.A)'ですか? – nullpointer

答えて

1

、複数行のラムダを使用し、(スイッチで)新しいメソッドを作成しないでください:

private void doSomethingBasedOnCategory(Category category) { 
    switch(category) { 
     case A: // do something 
       break; 
     case B: // do something 
       break; 
     case C: // do something 
       break; 
     case D: // do something 
       break; 
     case E: // do something 
       break; 
    } 
} 

次に、あなたのラムダでそれを使用します。

getCategories() 
    .stream() 
    .forEach(category -> doSomethingBasedOnCategory(category); 

もう一つの方法は、静的を作成することですマップキー(これはCategory.Xになります)と値(使用準備ができている機能)

+0

メソッドリファレンス 'this :: doSomethingBasedOnCategory'を使用することもできます – Lino

+0

これは意味があります。私はこれを使用すると思う。ありがとう! – Zuke

+0

@おまえあなたも受け入れて、質問を閉じることができます。 – ByeBye

1

唯一のことは、スイッチ・ステートメントを使用することです:

switch(category){  
    case Category.A: 
     // do Something 
    break; 
} 

カテゴリーが列挙型である場合にのみ動作しますluk2302によってmentionend通り。まず

+1

'Category'が単なる列挙型ではなく普通のクラスである場合はどうなりますか? – luk2302

+0

それは私が推測するように動作しません。作者は実際にこの情報を提供しませんでした。それは試みに値します。 – Basti

+0

カテゴリは列挙型ですので、これは動作します。ネストされたifまたはswitchのどちらかを使用するつもりでしたが、私がこれを尋ねた理由は、ラムダ関数を使ってこれを行う可能性があるかどうかを調べることでした。 – Zuke

1

CategoryクラスにdoSomethingメソッドを追加し、単に.forEachで呼び出すことができます。例えば

public class Category { 

    // any other methods/variable/constructors 

    public void doSomething() { 
     //do something 
    } 
} 

次に、あなたがこのようにそれを呼び出すことができます。// do somethingが共通の振る舞いをしていない

categories.stream().forEach(Category::doSomething); 

場合は、doSomethingメソッド内であれば一部を移動することができます。

+0

カテゴリは列挙型です。私はenumクラスのログインを書くことができますが、私はロジックを分離したままにしたいと思います。これがクラスの場合、これは私の実装であるはずです。ありがとう! – Zuke

関連する問題