2017-10-27 12 views
0

私は、彼らが「あなたはこの 変化に対応するために、あなたのAPIの多くを書き換えなければならないでしょう。また、このアプローチはあるこのコードスニペットでlambdaが優れているのはなぜですか?

はもちろんの1のアプローチでは、ラムダのhttps://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

上について読みました不必要に制限;あなたは 例」

public static void printPersonsOlderThan(List<Person> roster, int age) { 
    for (Person p : roster) { 
     if (p.getAge() >= age) { 
      p.printPerson(); 
     } 
    } 
} 
のために、一定の年齢よりも若いメンバーを印刷したい場合にはどのような 彼らはラムダ式を使用アプローチ5

printPersons(
    roster, 
    (Person p) -> p.getGender() == Person.Sex.MALE 
     && p.getAge() >= 18 
     && p.getAge() <= 25 
); 

をしかし、このラムダ式では、我々は、検索条件を変更したいときAPIを変更する必要があります。

なぜここでラムダを使用する方が、最初の方法でカスタムメソッドを使用するよりも優れていますか?

+6

あなたの質問がコードに関するものである場合、問題のコードはここに直接テキストとして投稿する必要があります。 – Carcigenicate

+0

"このラムダ式でも、検索条件を変更するときにAPIを変更する必要があります。"何?どうして?私は別の基準を使用する場合、私は別のラムダ式を使用します。機能は同じです。 – muru

+0

アプローチ5でAPIを変更する必要があります。 – 4castle

答えて

2

小さな例の問題は、実際のメリットを隠すことがあることです。この場合、彼らは報告ロジックを含むメソッドを探しています。アプローチ1は次のようになります。

public static void printPersonsOlderThan(List<Person> roster, int age) { 
    for (Person p : roster) { 
     if (p.getAge() >= age) { 
      p.printPerson(); 
     } 
    } 
} 

あなたは、このような特定の年齢より若く

  • 人の特定の年齢層の間
  • 者Aの
  • 者として他のレポートを、必要な場合は問題があり、特定の性別
  • など

あなたはforループや印刷指示を再実装する各ユースケースのための新しい方法を、記述する必要があります。

for (Person p : roster) { 
    if (specificCondition) { 
     p.printPerson(); 
    } 
} 

何が本当にしたいことは再利用にその周りのすべてのロジックですのみは、ループロジックとプリントロジックを書き換えずに、ユースケースの特定の検索条件を書き換えます。

アプローチ5では、printPersonsメソッドはパラメータとしてラムダを取ります。

printPersons(
    roster, 
    (Person p) -> p.getGender() == Person.Sex.MALE 
     && p.getAge() >= 18 
     && p.getAge() <= 25 
); 

あなたは、すべての印刷命令ループのための再書き込みをフルに持ってどこprintMalePersonsOlderThanAndYoungerThanのような新しいメソッドを記述することなく、printPersons方法にかかわらず、検索クエリを渡すことができます。

printPersonsが書かれている特定の瞬間、PersongetGender()方法でもまだ存在していない可能性がありますので、printMalePersonsOlderThanAndYoungerThan先験的を実現することは不可能だったでしょう。アプローチ5のもう1つの利点は、将来的に証明できるメソッドを提供できることです。モデルが変更された場合、特定の条件以外のコードを書く必要はありません。

関連する問題