Lambda表達式基礎語法
/*
* 一、Lambda 表達式的基礎語法:Java8中引入了一個新的操作符 "->"
* 該操作符稱爲箭頭操作符或 Lambda 操作符,箭頭操作符將 Lambda 表達式拆分成兩部分:
*
* 左側:Lambda 表達式的參數列表
* 右側:Lambda 表達式中所需執行的功能, 即 Lambda 體
*
* 語法格式一:無參數,無返回值
* () -> System.out.println("Hello Lambda!");
*
* 語法格式二:有一個參數,並且無返回值
* (x) -> System.out.println(x)
*
* 語法格式三:若只有一個參數,小括號可以省略不寫
* x -> System.out.println(x)
*
* 語法格式四:有兩個以上的參數,有返回值,並且 Lambda 體中有多條語句
* Comparator<Integer> com = (x, y) -> {
* System.out.println("函數式接口");
* return Integer.compare(x, y);
* };
*
* 語法格式五:若 Lambda 體中只有一條語句, return 和 大括號都可以省略不寫
* Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
*
* 語法格式六:Lambda 表達式的參數列表的數據類型可以省略不寫,因爲JVM編譯器通過上下文推斷出,數據類型,即“類型推斷”
* (Integer x, Integer y) -> Integer.compare(x, y);
*
*
* 二、Lambda 表達式需要“函數式接口”的支持
* 函數式接口:接口中只有一個抽象方法的接口,稱爲函數式接口。
* 可以使用註解@FunctionalInterface 修飾,此註解可以檢查是否是函數式接口
*/
語法格式一:無參數,無返回值
public class TestLDemo {
@Test
public void test1() {
int num = 0;//jdk 1.8 前,必須是顯示地寫出 final 1.8後可以省略finaldan但是仍然是不可變的 不能進行num++操作
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("匿名內部類:無參數,無返回值:" + num);
}
};
r.run();
System.out.println("------------------------------------------------------------");
Runnable rlambda = () -> System.out.println("語法格式一:無參數,無返回值:"+num);
rlambda.run();
}
}
語法格式二:有一個參數,並且無返回值
public class TestLDemo {
@Test
public void test1() {
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String str) {
System.out.println(str);
}
};
consumer.accept("匿名內部類測試:語法格式二:有一個參數,並且無返回值");
System.out.println("----------------------------------------------");
Consumer<String> consumerLambda = (str)-> System.out.println(str);
consumerLambda.accept("語法格式二:有一個參數,並且無返回值");
}
}
語法格式三:若只有一個參數,小括號可以省略不寫
public class TestLDemo {
@Test
public void test1() {
Consumer<String> cu = str-> System.out.println(str);
cu.accept("語法格式三:若只有一個參數,小括號可以省略不寫");
}
}
語法格式四:有兩個以上的參數,有返回值,並且 Lambda 體中有多條語句
public class TestLDemo {
@Test
public void test1() {
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
System.out.println("匿名內部類測試:語法格式四:有兩個以上的參數,有返回值,並且 Lambda 體中有多條語句");
return Integer.compare(o1,o2);
}
};
int compare = comparator.compare(1, 2);
System.out.println(compare);
System.out.println("----------------------------------------------");
Comparator<Integer> comparatorLambda = (x,y)->{
System.out.println("語法格式四:有兩個以上的參數,有返回值,並且 Lambda 體中有多條語句");
return Integer.compare(x, y);
};
int compareLambda = comparatorLambda.compare(2, 2);
System.out.println(compareLambda);
}
}
語法格式五:若 Lambda 體中只有一條語句, return 和 大括號都可以省略不寫
public class TestLDemo {
@Test
public void test1() {
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
}
}
語法格式六:Lambda 表達式的參數列表的數據類型可以省略不寫,因爲JVM編譯器通過上下文推斷出,數據類型,即“類型推斷”
@FunctionalInterface
public interface IMyNumCalculation<T, R> {
public R calculation(T t1, T t2);
// public R calculationTest(T t1, T t2); @FunctionalInterface 修飾只能有一個抽象方法
}
public class TestLDemo {
@Test
public void test1() {
IMyNumCalculation<Integer, Integer> calculation = (x, y) -> {
System.out.println("兩數相乘");
return x * y;
};
Integer result = calculation.calculation(6, 8);
System.out.println(result);
}
}
public class TestLDemo {
@Test
public void test1() {
Integer result = calculation(6,8,((x, y) -> x * y));
System.out.println(result);
Integer result1 = calculation(6, 8, ((x, y) -> x + y));
System.out.println(result1);
}
public Integer calculation(Integer t1, Integer t2, IMyNumCalculation<Integer, Integer> calculation){
return calculation.calculation(t1, t2);
}
}
Lambda表達式有什麼用處
https://blog.csdn.net/FL63Zv9Zou86950w/article/details/91467997