java 8 lambda表示式

Doto丶發表於2018-03-16

前些天在寫程式碼時,突然發現某一位大佬的程式碼中都是在用stream來操作List,自己的for迴圈相比之下黯然失色,遂決定要儘快學習一下java8。接下來突然的一週加班阻塞了我的行程,導致今天才有時間開始。 首先學習的就是lambda,因為後續的許多特性配合lambda食用效果更佳。

lambda表示式

lambda表示式允許將函式作為引數傳遞進方法中。lambda有什麼作用呢?我目前的理解是:

make your code elegant!!!

在java 8 以前,java是不允許將函式複製給變數的,比如:

lambda = public void print(String s){
	System.out.println(s);
} 
複製程式碼

這種操作是不允許的。

那麼在java 8 中,這個lambda是什麼型別呢?是一個“函式型介面”,函式型介面與普通介面最大的區別就是函式型介面只有一個函式需要被實現。為了防止後續人員對函式型介面進行新增,java8新增了@FunctionalInterface註解,可以防止函式型介面被新增函式(注意:default和static方法並不受約束,仍舊可以新增使用)。
像這樣:

@FunctionalInterface
public interface MyLambdaInterface {
    void doSomething(String s);
}
複製程式碼

ok,做完這些我們就可以開始使用lambda了。下面的程式碼可以在一個方法中列印字串。

MyLambdaInterface lambdaInterface = (e) -> System.out.println(e);
lambdaInterface.doSomething("huyashi is good!");
複製程式碼

這樣的情況下已經比java7及以前簡潔了太多太多。不信你可以自己用java7實現一個類似的效果。

但是lambda就僅止於此嗎?NO!如果你有5個方法,每個方法都是接受String而返回void,每個方法僅僅使用一次。java7卻要求定義5個不同的介面實現類,而lambda只需要5行程式碼。

上述情況只是lambda的最簡單使用姿勢,你當然可以定義負責的介面,如多個引數,具有返回值,只需要在賦值lambda時用花括號將函式的實現括起來就好。

一個簡單的小栗子:

@FunctionalInterface
public interface HardInterface {
    String  add(String s, int i);
}
複製程式碼

使用:

HardInterface hardInterface = (String s, int i) -> {
    s = s.substring(0, 1);
    i = i + 10;
    return s+i;
};
hardInterface.add("huyanshi",110);
複製程式碼

總結一下:
lambda表示式替代了原先的匿名類的作用,將
1.編寫介面實現類,實現該介面中的方法。
2.new 一個實現類的例項。 簡化為:new 一個介面的例項並將一個方法賦值給它

Lambda結合FunctionalInterface Lib, forEach, stream(),method reference等新特性可以使程式碼變的更加簡潔!



ChangeLog

2018-03-11 完成

以上皆為個人所思所得,如有錯誤歡迎評論區指正。

歡迎轉載,煩請署名並保留原文連結。

更多學習筆記見個人部落格------>呼延十

相關文章