lambda
Lambda 是一個匿名函數,我們可以把 Lambda 表達式理解爲是一段可以傳遞的代碼(將代碼像數據一樣進行傳遞)。可以寫出更簡潔、更靈活的代碼。作爲一種更緊湊的代碼風格,使Java的語言表達能力得到了提升。
lambda 語法格式
(parameters) -> expression 或者 (parameters) -> {statements;}
lambda區分好左右各是什麼。左邊:參數,右邊:表達式。
注意事項:
- 如果參數只有一個,可以不加圓括號
- 不需要聲明參數類型,因爲可以類型推斷
- 如果只有一條語句,可以不加花括號
- 如果只有一條語句,編譯器會自動將值返回;如果多條的話,需要手動return
lambda 所需支持
Lambda 表達式需要“函數式接口”的支持 ,
函數式接口
接口中只有一個抽象方法的接口,稱爲函數式接口。 可以使用註解 @FunctionalInterface 修飾 (可以檢查是否是函數式接口,如果不是函數式接口則會編譯不通過)
代碼案例
package cn.alistarfeng.demo.lambda;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Comparator;
import java.util.function.Consumer;
/**
* @Auther: alistarfeng
* @Date: 2019/9/12 15:51
* @Description: lambda 學習 (parameters) -> expression 或者 (parameters) -> {statements;}
*/
public class LambdaDemo {
private Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 語法格式1 : 無參數,無返回值
*/
@Test
public void test1() {
//原來的方式
Runnable runnable = new Runnable() {
@Override
public void run() {
logger.info("hello world");
}
};
runnable.run();
//lambda
Runnable runnable1 = () -> logger.info("hello world 2");
runnable1.run();
}
/**
* 語法格式二 :有一個參數,並且無返回值,(只有一個參數可省略括號)
*/
@Test
public void test2() {
//原來的方式
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String s) {
logger.info(s);
}
};
consumer.accept("hope");
//lambda的方式
Consumer<String> consumer1 = (str) -> logger.info(str);
consumer1.accept("hope1");
Consumer<String> consumer2 = str -> logger.info(str);
consumer2.accept("hope2");
}
/**
* 語法格式三:有兩個以上的參數,有返回值,並且 Lambda 體中有多條語句(需要使用花括號括起來 , 且有返回的值的時候必須加return)
*/
@Test
public void test3() {
//原來的方式
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
logger.info("匿名內部類輸出");
return o1 - o2;
}
};
logger.info("comparator: {}", comparator.compare(4, 3));
//lambda
Comparator<Integer> comparator2 = (x, y) -> {
logger.info("Lambda輸出");
return x - y;
};
logger.info("comparator2: {}", comparator2.compare(4, 3));
}
/**
* 語法格式四:若 Lambda 體中只有一條語句, return 和 大括號都可以省略不寫
*/
@Test
public void test4(){
//原來使用匿名內部類
Comparator<Integer> com = new Comparator<Integer>() {
@Override
public int compare(Integer x, Integer y) {
return Integer.compare(x, y);
}
};
logger.info("comparator: {}", com.compare(4, 3));
//Lambda 表達式
Comparator<Integer> com1 = (x, y) -> Integer.compare(x, y);
logger.info("comparator2: {}", com.compare(4, 3));
}
}
代碼地址:https://github.com/alistarfeng/java-learning/tree/master/java8-demo