之前因为spark学习了scala,作为同样运行在jvm上的语言,在学习scala的期间,我深深的被震撼到了,因为之前没有学习过函数式编程(其实第一个学习的就是python,但是根本没有用到过它的函数式编程).但是当我看到java8的新特性时,我发现java也可以进行函数式编程.
函数式编程的目的意义没有副作用等等这里先不说,就先说说如何将函数作为参数和返回值
利用java进行函数式编程主要就是利用函数式接口,但是函数式接口在java8之前就有一些了,就例如多线程的runnable,但是8以前是没有lambda表达式的,所以只能使用匿名内部类,在用过lambda表达式的人看来,那是相当臃肿的,8更新了lambda表达式,这就使函数式编程更上一层楼.
这里介绍一个函数式接口(函数接口有很多,而且可以自定义),函数式接口是什么呢?一言以蔽之,函数式接口就是只有一个抽象方法的接口(只有一个抽象方法,不代表只有一个方法,在java8中,接口还可以有默认方法,可以了解一下).这里我利用它来说明java函数式编程,这个函数式接口就是IntConsumer,它接受一个int值,没有返回,我们这样使用,看代码:
void s(int ss,IntConsumer sss){
sss.accept(ss);
}
public static void main(String[] args){
test t = new test();
t.s(1,x->System.out.println(x));
}
结果就是返回1
这个例子很好理解,方法s接收了sss,在java中我们认为那是接收了一个接口作为参数,但是在函数是编程中,我们要认为它是接收了一个函数作为参数,这个函数的函数名是sss,函数字面量就是x->System.out.println(x);这个函数字面量就是lambda表达式,如果用匿名内部类就是
new IntConsumer{
void sss(int x){
System.out.println(x);
}
}
这样对比就很明显了.
然后是将函数作为返回,其实照着前面的代码就可以了写出了,
IntConsumer g(IntConsumer s){
return s ;
}
public static void main(String[] args) {
test t = new test() ;
t.g(x-> System.out.println(x)).accept(1);
}
还是同样的道理,返回1;
就先写到这里