java8新特性之lambda表示式(一)
阿新 • • 發佈:2019-02-16
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表示式:其實就是按一定語法,省略書寫固定的程式碼,達到簡化程式碼的效果