java8新特性之lambda表示式(一)

LiuJun2Son發表於2016-08-23

lambda使用案例:

需求1:對List集合中的User按照age的大小進行排序輸出:

1.普通的寫法:

    private static List<User> list=new ArrayList<User>();
    public static void main(String[] args) {
        list.add(new User(34));
        list.add(new User(14));
        list.add(new User(24));
        System.out.println("排序前:"+list.toString());
        //對list集合的資料進行按照年齡排序
        Collections.sort(list, new Comparator<User>() {

            @Override
            public int compare(User o1, User o2) {
                // TODO Auto-generated method stub
                return Integer.compare(o1.age, o2.age);
            }
        });
        System.out.println("排序後:"+list.toString());
    }

    ------------------------

    輸出結果:

    排序前:[34, 14, 24]
    排序後:[14, 24, 34]

2.使用lambda的寫法:

    private static List<User> list=new ArrayList<User>();
    public static void main(String[] args) {
        ......
        System.out.println("排序前:"+list.toString());
        //對list集合的資料進行按照年齡排序(現在一行就可以代替上面的排序程式碼)
        Collections.sort(list, (o1,o2)->Integer.compare(o1.age, o2.age));
        System.out.println("排序後:"+list.toString());
    }

    ------------------------

    輸出結果:

    排序前:[34, 14, 24]
    排序後:[14, 24, 34]

需求2:新開一個子執行緒,並在子執行緒中輸出“helloWord”

1.普通的寫法:

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("HelloWord");
            }
        }).start();
    }

2.使用lambda的寫法:

    public static void main(String[] args) {
        //使用這個:()->Syso("HelloWord")表示式代替內部類,其實Syso("HelloWord")這個位置可以使用一個方法來代替
        new Thread( ()->System.out.println("HelloWord") ).start();
    }

案例分析:

lambda表示式:其實就是省略書寫固定的程式碼

下面的程式碼那些是固定的呢?那些是可以省略書寫的呢?

        //對list集合的資料進行按照年齡排序
        Collections.sort(list, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                return Integer.compare(o1.age, o2.age);
            }
        });

可以省略書寫的是:

1.new Comparator() 這個是固定的,因為引數必須接受Comparator

2.compare這個方法名也是可以省略

3.compare這個方法的返回值和許可權都可以省略

省略固定的程式碼後變成:

    //對list集合的資料進行按照年齡排序
    Collections.sort(list,
                (User o1, User o2)->{
            return Integer.compare(o1.age, o2.age);
        }
    );

還有什麼可以省略得呢?其實(User o1, User o2)的User也可以省略,因為list集合裡存的都是User,JVM是可以猜測的出引數額型別。

省略固定的程式碼後變成:

    //對list集合的資料進行按照年齡排序
    Collections.sort(list,
                ( o1,  o2)->{
            return Integer.compare(o1.age, o2.age);
        }
    );

還有什麼可以省略得呢?其實return也可以省略,JVM是可以猜測的出返回型別。

省略固定的程式碼後變成:

    //對list集合的資料進行按照年齡排序
    Collections.sort(list,
                ( o1,  o2)->
                    Integer.compare(o1.age, o2.age)

    );

修改最終變成:

    //lambda表示式是:(o1,  o2)->(Integer.compare(o1.age, o2.age))。代替複雜內部類
    Collections.sort(list,  (o1,  o2)->(Integer.compare(o1.age, o2.age)) );

lambda表示式的基本語法

lambda表示式的基本語法:引數列表->表示式

    引數列表:
    1.如果沒有引數,直接用()來表示。//如上需求2的()->System.out.println("HelloWord")
    2.如果只有一個引數,並且引數寫了型別,引數外面一定要加()。
    3.如果只有一個引數,並且引數不寫型別,那麼這個引數外面可以不用加(。
    4.如果有兩個或者多個引數,不管是否寫引數型別,都要加()。//如上需求1
    5.如果引數要加修飾符或者標籤,引數一定要加上完整的型別。

    表示式:
    1.如果表示式只有一行,那麼可以直接寫(不需要{});
    2.如果表示式只有多行,需要用{}變成程式碼塊;
    3.如果表示式是程式碼塊,並且方法需要返回值,那麼在程式碼塊中就必須返回一個返回值;
    4.如果只有單行的情況,並且方法需要返回值,不能有return,編譯器會自動幫我們推導return;

總結:

1.lambda表示式:其實就是按一定語法,省略書寫固定的程式碼,達到簡化程式碼的效果

相關文章