lambda表達式

lambda表達式是在jdk1.8後新增的,所以使用lambda表達式程序編譯需要基於1.8版本;使用lambda表達式是因爲對程序員來說起名比較困難,程序員只需要關新的業務邏輯,不關心名稱,所以lambda表達式一般用於實現匿名內部類或接口,語法()->{}

代碼示例

    @Test
    public void test02() {
        /**
         * 原來使用內部類作爲參數傳遞
         */
        TreeSet<String> ts01 = new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return Integer.compare(o1.length(), o2.length());
            }
        });
        String s1 = "abc";
        String s2 = "fghg";
        ts01.add(s1);
        ts01.add(s2);
        for (String t : ts01) {
            System.out.println(t);
        }

        /**
         * lambda表達式1
         */
        TreeSet<String> ts02 = new TreeSet<>((x, y) -> {
            return Integer.compare(x.length(), y.length());
        });
        ts02.add(s1);
        ts02.add(s2);
        for (String t : ts02) {
            System.out.println(t);
        }
        /**
         * lambda表達式2
         */
        TreeSet<String> ts03 = new TreeSet<>((x, y) ->
                Integer.compare(x.length(), y.length())
        );

        ts03.add(s1);
        ts03.add(s2);
        for (String t : ts03) {
            System.out.println(t);
        }
    }

1.語法一,無參數,無返回值

 public void test04() {
        //傳統的方式,創建匿名內部類啓動線程
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("anonymous inner class...");
            }
        };

        //使用lambda表達式
        Runnable r2 = () -> System.out.println("Lambda ...");
        //調用了run方法,不是啓動線程
        r1.run();
        r2.run();
    }

2.語法二:有一個參數,無返回值(只有一個參數可以去掉小括號)

    @Test
    public void test05() {
        //原先使用匿名內部類調用MyLambda接口的sayHello
        MyLambda myLambda01 = new MyLambda() {
            @Override
            public void sayHello(String str) {
                System.out.println("hello anonymous innner class ..." + str);
            }
        };

        //使用lambda表達式
        MyLambda myLambda02 = (x) -> System.out.println("hello Lambda " + x);

        myLambda01.sayHello("Tom");
        myLambda02.sayHello("Jim");
    }

    @FunctionalInterface
    interface MyLambda {
        void sayHello(String str);
    }

3.語法三:有兩個以上的參數,有返回值,並且Lambda表達式有多條語句(需要使用花括號括起來)

    @Test
    public void test06() {
        Comparator<Integer> comparator01 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println("anoyous inner class out");
                return Integer.compare(o1, o2);
            }
        };

        //Lambda表達式
        Comparator<Integer> comparator02 = (x, y) -> {
            System.out.println("Lambda out");
            return Integer.compare(x, y);
        };

        //測試
        System.out.println(comparator01.compare(123, 44));
        System.out.println(comparator02.compare(123, 44));
    }

4.語法四:Lambda體中只有一個語句,return和大括號都可以不寫

    @Test
    public void test07() {
        Comparator<Integer> comparator01 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1, o2);
            }
        };

        //Lambda表達式
        Comparator<Integer> comparator02 = (x, y) ->
                Integer.compare(x, y);


        //測試
        System.out.println(comparator01.compare(123, 44));
        System.out.println(comparator02.compare(123, 44));
    }

5.語法五:lambda表達式的參數列表的數據類型可以省略不寫,因爲jvm編譯器可以通過上下文推斷出

   @Test
    public void test08() {

        Comparator<Integer> comparator01 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1, o2);
            }
        };

        //Lambda表達式
        Comparator<Integer> comparator02 = (x, y) ->
                Integer.compare(x, y);

        //Lambda表達式
        Comparator<Integer> comparator03 = (Integer x, Integer y) ->
                Integer.compare(x, y);
        Comparator<Integer> comparator04 = Integer::compare;

        //測試
        System.out.println(comparator01.compare(123, 44));
        System.out.println(comparator02.compare(123, 44));
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章