なぜLambda式を使うのか詳しく言えば


https://blog.csdn.net/oXinYangonly/article/details/81369874


Lambda式
  • Lambdaは匿名関数であり、伝達可能なコードと理解でき、コードをデータのように伝達し、より概要的で柔軟なコードを書くことができる.よりコンパクトなコードスタイルとして、Javaの言語表現能力を
  • 向上させた.
    匿名の内部クラスを使用してスレッドを作成しますRunnable runnable = new Runnable() { @Override public void run() { System.out.println("run ... "); } }; Thread thread = new Thread(runnable); thread.start();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 上記のコードでは、Runnableインタフェースを使用してオブジェクトを直接作成し、6行のコードを使用しましたが、この6行のコードでは、本当に役に立つコードはrunメソッドの1行だけです.System.out.println("run ... ");
  • 1
  • 次に、Lambda式を使用して、これらのコードを簡略化します.Runnable runnable = ()-> System.out.println("run ..."); Thread thread = new Thread(runnable); thread.start();
  • 1
  • 2
  • 3
  • この場合、私たちのコードは3行しかありませんが、これは最終的なバージョンではありません.次のコードを見てください.new Thread(()->System.out.println("run ... ")).start();
  • 1
  • 最小限のコード量を使用して、同じ機能を実現しました.Lambda式の例
    需要:教務システムの学生に対して照会操作を行う
  • 学生クラスを作成し、属性はそれぞれ名前、性別、学年
  • である.public class Student { /** * */ private String name; /** * * 1 * 0 */ private int gender; /** * * 1 * 2 * 3 * 4 */ private int grade; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 需要一:学生の中で3年生以上の学生
  • を取得する
    コード構想は,上記の学生集合をパラメータとしてフィルタリングの方法に入力し,条件に合致する学生集合を返す.public List filterStudentsByGrade(List students){、 List stus = new ArrayList<>(); for (Student s : students){ if(s.getGrade() >= 3){ stus.add(s); } } return stus; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • この時、私たちは完璧に需要の中で必要な機能を実現しました!
    しかし、日常開発でプログラマーが最も憎むことが起こり、需要が変わった.
  • 需要二:学生の男子学生
  • を取得する
    考え方:最も簡単な方法で、私たちは新しい方法を書きます.public List filterStudentsByGender(List students){ List stus = new ArrayList<>(); for (Student s : students){ if(s.getGender() == 1){ stus.add(s); } } return stus; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • しかし、このような需要がますます多くなると、コードの中の方法は千編一律で、それぞれの方法の中で判断の条件が異なるだけで、他のコードはすべて同じで、大量の冗長コードで、私たちにコードを最適化して、再構築しなければならないことを発見しました.
    無数の先輩たちが無数の穴を越えた後、コードを最適化するのに非常に良いもの--設計モードをまとめてくれました.
    次に,設計モードを用いて上のコードを最適化する.
  • は、単純なポリシーインターフェースSimpleStrategyを作成し、方法operateにおいてオブジェクトを入力することができ、その後、このインターフェースの実装クラスにおいて、フィルタ条件処理
  • を行うことができる.public interface SimpleStrategy<T>{ public boolean operate(T t); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • これにより、これまで増加してきた需要のために書かれた千編一律の方法
  • を新しい方法で置き換えることができます.public List filterStudentByStrategy(List students,SimpleStrategy strategy){ List stus = new ArrayList<>(); for (Student s : students){ if(strategy.operate(s)){ stus.add(s); } } return stus; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • このとき,メソッドにSimpleStrategyの実装クラスを渡すだけで,自由にフィルタリングできることが分かった.テストコードは以下の通りである.@Test public void getMoreThanThreeGrade(){ List sts = filterStudentByStrategy(students, new SimpleStrategy() { @Override public boolean operate(Student student) { return student.getGender() == 1; } }); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • ポリシーモードを用いて匿名の内部クラスで学生情報をフィルタリングしたが,コード全体で本当に役に立つコードは実は一言である.student.getGender() == 1;
  • 1
  • 2
  • しかし、私たちは機能を完成させるために、冗長なコードを繰り返し書かなければなりません.
  • 福音書:Lambda式を使用して、冗長コード
  • を繰り返していません.List sts = filterStudentByStrategy(students,(s)->s.getGender() == 1);
  • 1
  • このとき、私たちの最後のフィルタコードは1行しかありませんが、本当に完璧ですか?とは限らない
    私たちは上にポリシーのインタフェースを作成しました.そして、方法を宣言しました.コードはまだたくさんあります.では、インタフェースを作成しなくても、フィルタリングの方法を宣言しなくても、直接1行のコードで上の機能を実現する方法はありませんか.
    もちろん、Lambda式とStream API式を使うだけで上記の機能を完璧に実現できます.List sts = students.stream().filter(student -> student.getGender() == 1).collect(Collectors.toList());
  • 1
  • 2
  • これで本当に完璧です!!!
    テキストリンクhttp://blog.3811811.com/2018/08/02/%E7%BB%86%E8%AF%B4%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E4%BD%BF%E7%94%A8lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F/