一、lambda表達式

一、lambda概念

  • java8 它可讓咱們用簡潔流暢的代碼完成一個功能。java

  • 很長一段時間java被吐槽是冗餘和缺少函數式編程能力的語言,隨着函數式編程的流行java8種也引入了 這種編程風格。程序員

在此以前咱們都在寫匿名內部類幹這些事,但有時候這不是好的作法,本文中將介紹和使用lambda, 帶你體驗函數式編程的魔力express

lambda表達式是一段能夠傳遞的代碼,它的核心思想是將面向對象中的傳遞數據變成傳遞行爲編程

咱們回顧一下在使用java8以前要作的事,以前咱們編寫一個線程時是這樣的:ide

Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("do something.");      
    }
}

也有人會寫一個類去實現Runnable接口,這樣作沒有問題,咱們注意這個接口中只有一個run方法, 當把Runnable對象給Thread對象做爲構造參數時建立一個線程,運行後將輸出do something.。 咱們使用匿名內部類的方式實現了該方法函數式編程

這其實是一個代碼即數據的例子,在run方法中是線程要執行的一個任務,但上面的代碼中任務內容已經被規定死了。 當咱們有多個不一樣的任務時,須要重複編寫如上代碼函數

設計匿名內部類的目的,就是爲了方便 Java 程序員將代碼做爲數據傳遞。不過,匿名內部 類仍是不夠簡便。 爲了執行一個簡單的任務邏輯,不得不加上 6 行冗繁的樣板代碼。那若是是lambda該怎麼作?學習

Runnable r = () -> System.out.println("do something.");

嗯,這代碼看起來很酷,你能夠看到咱們用()和->的方式完成了這件事,這是一個沒有名字的函數,也沒有人和參數,再簡單不過了。 使用->將參數和實現邏輯分離,當運行這個線程的時候執行的是->以後的代碼片斷,且編譯器幫助咱們作了類型推導; 這個代碼片斷能夠是用{}包含的一段邏輯。下面一塊兒來學習一下lambda的語法。線程

二、lambda基本語法

2.一、基本概念

expression = (variable) -> action
  • variable: 這裏是一個變量,一個佔位符,像x,y,z,能夠是多個變量,也就是說左側是lambda表達式的參數列表
  • action: 這裏我稱它爲action(也就是表達式中所需執行的功能), 這是咱們實現的代碼邏輯部分,它能夠是一行代碼也能夠是一個代碼片斷
  • 能夠看到Javalambda表達式的格式:參數、箭頭、以及動做實現,當一個動做實現沒法用一行代碼完成,能夠編寫 一段代碼用{}包裹起來
  • lambda表達式能夠包含多個參數
int sum = (x, y) -> x + y;

這時候咱們應該思考這段代碼不是以前的xy數字相加,而是建立了一個函數,用來計算兩個操做數的和。 後面用int類型進行接收,在lambda中爲咱們省略去了return設計

2.二、語法格式

  • 語法格式一:無參數,無返回值
Runnable runnable1 = () -> System.out.println("lambda表達式");
  • 語法格式二:有一個參數,無返回值
// Consumer 接口能夠查看源碼
 Consumer<String> consumer = (x)-> System.out.println(x);
 consumer.accept("有參數的lambda表達式");
  • 語法格式三:若只有一個參數,小括號能夠不寫省略
Consumer<String> consumer = x-> System.out.println(x);
        consumer.accept("有參數的lambda表達式");
  • 語法格式四:有兩個參數以及以上參數,有返回值,方法體多條語句
Comparator<Integer> comparator1 = (x, y) -> {
            System.out.println(x + y);
            return Integer.compare(x,y);
        };
  • 語法格式五:若是lambda體中只有一條語句,return和大括號均可以省略不寫
Comparator<Integer> comparator1 = (x, y) -> Integer.compare(x, y);
  • 語法格式六: Lambda表達式的參數列表的數據類型能夠省略不寫,由於JVM編譯器經過上下問推斷出數據類型---類型推斷
Comparator<Integer> comparator1 = (x, y) -> Integer.compare(x, y);

三、Lambda表達式例子

以下的代碼咱們仔細閱讀

  • 函數型接口
@FunctionalInterface
public interface MyFunction<T> {

    public Integer getValue(Integer num);

}

上面的代碼,咱們定義了一個函數型的接口,該接口存在一個抽象方法,該方法的具體實現由咱們本身實現

  • 調用
public class TestLambda02 {

    public static void main(String[] args) {
        Integer value = operation(100, x -> x * 2);
        System.out.println(value);
    }
    public static Integer operation(Integer num, MyFunction mf) {

        return mf.getValue(num);
    }
}

上面代碼中,對於函數型接口MyFunction,咱們採用了自定義實現x->x*2,由此能夠發現lambda表達式就是一段能夠傳遞的代碼

相關文章
相關標籤/搜索