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));
}