什么是函数式编程呢?首先它是一种编程思想,就像面向对象编程和面向过程编程一样。不久前才接触到函数式编程的概念,很快我就喜欢上了这种编程方式。
最初知道函数式编程是在一次面试中,面试官问我了解函数式编程吗。可惜那时我毫无概念,后来开始了解了一些,但是网上那些华而不实的概念并没有让我弄懂什么是函数式编程。 java8已经发布,而其中最令人称赞的莫过于的其对lambda表达式的支持,首先什么是lambda表达式呢?lambda表达式直观的语法如下:
()->{}
其中"()"中写的是其参数列表,"->"只是作为连接符,"{}"是lambda表达式的主体部分,关于其具体的变形语法大家可以自行百度,或者也可以去读我在文章后面推荐的书。其实lambda表达式就是javascript中的匿名函数,javascript中有这样的语法:
$("button[name='button']").click(function(){
alert("hello");
});
其中click函数中的部分就是一个匿名函数,而在java语言中对此的表达方式就是lambda表达式了,同时我也举一个在java中lambda表达式的例子:
list<integer> numbers = Arrays.asList(1,2,3,4,5);
numbers.forEach((number)->{
System.out.println(number);
});
其中forEach函数中的就是一个lambda表达式,如果给之前js中的匿名函数传个参数那就更像了,如下
$("button[name='button']").click(function(value){
alert(value);
});
js中可以将一个函数赋值给一个变量,从而将这个变量当做参数传入函数中,java中类似的支持是函数以引用,如果你想调用System.out.println()函数那么你可以这样使用
System.out::println,这就是println函数的引用,构造函数的引用是这样的,例如对User类,其构造函数的引用为:User::new。
为什么可以在java中使用forEach函数呢?因为forEach函数的定义中的参数就是一个函数式接口。先举一个例子:
@FunctionalInterface
public interface Display{
void sayHello(String word);
}
有了Diplay接口那么在将DisPlay作为参数的函数中就可以给其传入一个无参的lambda表达式。
如下:
interface Show{
void hello(Display display);
}
如果ShowImpl是Show接口的实现类那么,
new Showlmpl().hello((word)->{
System.out.println(word);
});
这篇文章旨在让读者明白什么是函数式编程,什么是lambda表达式,并未关注于语法细节,通过这篇文章希望读者对函数式编程有一个清晰的认识。由于我最初学习时,了解语法细节,但是并没有找到一篇文章对lambda表达式的整体做一个清晰的说明,我写这篇文章希望能帮到正在学习lambda表达式或对函数式编程有兴趣的读者。
另外推荐一本书《java8函数式编程入门》这本书在百度阅读上可以找到,如果要看全本需要购买,不过好像也就1块钱。看了我这篇文章,再读这本书我相信你会有一定的收获。另外如果大家也可以google,找一些英文的资料。
刚开始写技术性的文章,希望得到大家支持,如果觉得还不错,欢迎评论,你们的鼓励是我继续创作的动力。欢迎转载,转载请注明出处。