什么是函數(shù)式編程呢?首先它是一種編程思想,就像面向?qū)ο缶幊毯兔嫦蜻^程編程一樣。不久前才接觸到函數(shù)式編程的概念,很快我就喜歡上了這種編程方式。
最初知道函數(shù)式編程是在一次面試中,面試官問我了解函數(shù)式編程嗎。可惜那時我毫無概念,后來開始了解了一些,但是網(wǎng)上那些華而不實的概念并沒有讓我弄懂什么是函數(shù)式編程。 java8已經(jīng)發(fā)布,而其中最令人稱贊的莫過于的其對lambda表達式的支持,首先什么是lambda表達式呢?lambda表達式直觀的語法如下:
()->{}
其中"()"中寫的是其參數(shù)列表,"->"只是作為連接符,"{}"是lambda表達式的主體部分,關(guān)于其具體的變形語法大家可以自行百度,或者也可以去讀我在文章后面推薦的書。其實lambda表達式就是javascript中的匿名函數(shù),javascript中有這樣的語法:
$("button[name='button']").click(function(){
alert("hello");
});
其中click函數(shù)中的部分就是一個匿名函數(shù),而在java語言中對此的表達方式就是lambda表達式了,同時我也舉一個在java中l(wèi)ambda表達式的例子:
list<integer> numbers = Arrays.asList(1,2,3,4,5);
numbers.forEach((number)->{
System.out.println(number);
});
其中forEach函數(shù)中的就是一個lambda表達式,如果給之前js中的匿名函數(shù)傳個參數(shù)那就更像了,如下
$("button[name='button']").click(function(value){
alert(value);
});
js中可以將一個函數(shù)賦值給一個變量,從而將這個變量當做參數(shù)傳入函數(shù)中,java中類似的支持是函數(shù)以引用,如果你想調(diào)用System.out.println()函數(shù)那么你可以這樣使用
System.out::println,這就是println函數(shù)的引用,構(gòu)造函數(shù)的引用是這樣的,例如對User類,其構(gòu)造函數(shù)的引用為:User::new。
為什么可以在java中使用forEach函數(shù)呢?因為forEach函數(shù)的定義中的參數(shù)就是一個函數(shù)式接口。先舉一個例子:
@FunctionalInterface
public interface Display{
void sayHello(String word);
}
有了Diplay接口那么在將DisPlay作為參數(shù)的函數(shù)中就可以給其傳入一個無參的lambda表達式。
如下:
interface Show{
void hello(Display display);
}
如果ShowImpl是Show接口的實現(xiàn)類那么,
new Showlmpl().hello((word)->{
System.out.println(word);
});
這篇文章旨在讓讀者明白什么是函數(shù)式編程,什么是lambda表達式,并未關(guān)注于語法細節(jié),通過這篇文章希望讀者對函數(shù)式編程有一個清晰的認識。由于我最初學(xué)習(xí)時,了解語法細節(jié),但是并沒有找到一篇文章對lambda表達式的整體做一個清晰的說明,我寫這篇文章希望能幫到正在學(xué)習(xí)lambda表達式或?qū)瘮?shù)式編程有興趣的讀者。
另外推薦一本書《java8函數(shù)式編程入門》這本書在百度閱讀上可以找到,如果要看全本需要購買,不過好像也就1塊錢。看了我這篇文章,再讀這本書我相信你會有一定的收獲。另外如果大家也可以google,找一些英文的資料。
剛開始寫技術(shù)性的文章,希望得到大家支持,如果覺得還不錯,歡迎評論,你們的鼓勵是我繼續(xù)創(chuàng)作的動力。歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處。