Java 8:関数式プログラミング(lambda)

17605 ワード

なぜlambda式を使うのですか?1.javaの一般的なコマンドプログラミングパラメータの入力と戻りは値またはオブジェクトの参照のみであり、1つの関数をパラメータとする方法も、1つの関数を返す方法も宣言できません.2.python言語の人気が線形に増加しているため、関数式プログラミングも業界で肯定されている.以上の2点をまとめると、java 8にはいくつかの新しい特性が追加されています.これはjava史上最大のバージョン変更で、伝統的なコマンドプログラミングスタイルを保証した上で、関数プログラミングスタイルを追加し、lambda式は方法のパラメータと戻り値に1つの関数を入力し、返す方法です.
  • lambda式の構文:
  • 1.{}
    () -> System.out.println("  1")
    
    2.{}
    (param) -> System.out.println("  1")
    
    3.         
    (param1,param2) -> {
    	System.out.println(param1);
    	System.out.println(param2);
    }
    ...
    
  • 匿名内部クラス:
  • 1.Thread:
    new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("   ");
                }
            }).start();
    
    new Thread(() -> System.out.println("   ")).start();
    
    2.Comparator:
    List<String> list = Arrays.asList("zs","ls","ww");
    //   :
    Collections.sort(list, new Comparator<String>() {
      @Override
       public int compare(String o1, String o2) {
           return o1.compareTo(o2);
       }
    });
    //   1
    Collections.sort(list,(a,z)->a.compareTo(z));
    //   2
    Collections.sort(list, String::compareTo);
    
  • forEach:
  • List<Integer> list= Arrays.asList(1,2,3,4,5,6);
    //   :         ,Consumer   java         
    list.forEach(new Consumer<Integer>() {
    	@Override
    	public void accept(Integer integer) {
        	System.out.println(integer);
    	}
    });
    //   
    list.forEach(i -> System.out.println(i));
    

    実はlambda式はインタフェースのメソッドを書き換えたオブジェクトです
  • .関数インタフェース
  • カスタム関数インタフェース
    @FunctionalInterface
    interface test{
        void mytest();
        String toString();
    }
    
    lambda式は関数インタフェースに依存しなければならない.関数インタフェースには抽象的な方法が1つしか存在せず(Objectを書き換える方法を除く).インタフェースに@FunctionalInterfaceを追加すると、このインタフェースが関数インタフェースであることを示します(この注釈を付けなくてもjavaはコンテキストで推定されますが、抽象的な方法は1つしか存在しないことを保証する必要があります)
  • 四大内蔵関数インタフェース
  • Consumer:コンシューマインタフェース
    /**
    * Consumer:     
     *      void accept(T t);      
     */
    @Test
    public void test01(){
        eat(1000,e -> System.out.println("    ,  "+e+" "));
    }
    public void eat(double money, Consumer<Double> consumer){
        consumer.accept(money);
    }
    
  • Supplier:供給型インタフェース
    /**
      * Supplier:     
      *      T get();      
      */
     @Test
     public void test02(){
         List<Integer> list = getNumList(10, () -> (int) (Math.random() * 100));
         list.forEach(i -> System.out.println(i));
     }
    
     public List<Integer> getNumList(int num, Supplier<Integer> supplier){
         List<Integer> list = new ArrayList<>();
         for (int i = 0; i < num; i++) {
             Integer integer = supplier.get();
             list.add(integer);
         }
         return list;
     }
    


  • 未完待続...