函数式编程
函数式编程更多时候是一种编程的思维方式,是一种方法论。函数式与命令式编程区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做。简单说,函数式编程是基于某种语法或调用API去进行编程。
例如,从整型数组中找出最小的那个数字,采用命令式编程实现如下:
public static void main(String[] args){
int[] array={
1,2,3,4,5,6,7,8,9,10};
int minx=Integer.MAX_VALUE;
for(int a:array){
if(a<minx)
minx=a;
}
System.out.println(minx);
}
而采用函数式编程来实现,则简化为如下代码:
int[] array = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int minx = IntStream.of(array).min().getAsInt();
System.out.println(minx);
我们可以看出,命令式编程需要自己实现具体逻辑,而函数式编程则是调用API完成需要,将命令式的代码写成一系列函数调用,在函数式编程下代码更简洁、易懂,这也就是为什么要使用函数式编程的原因之一。所以才说函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做,这是一种思维的转变。
而lambda
表达式作为函数式编程的基础,也就显得十分重要:
在Java
不支持lambda
表达式的时候,我们会去这样创建一个线程:
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("run()方法");
}
}).start();
而采用lambda
表达式:
new Thread(() -> System.out.println("run()")).start();
lambda
表达式一句话即完成线程的创建,它强调了函数的输入输出,而隐藏了内部实现细节,并且可以接收函数作为输入(参数)和输出(返回值).
在->
的左边是输入,右边是输出.上述代码参数为空。
该lambda
表达式的作用就是返回了Runnable
接口的实现对象,这调用某个方法获取实例对象类似,只不过是将实现代码直接写进了lambda
表达式中.
JDK8接口新特性
-
函数接口,接口只能有一个需要实现的方法,可以使用
FunctionalInterface
注解进行声明@FunctionalInterface public interface InterfaceOne { int doubleNum(int i); }
使用
lambda
表达式获取该接口的实现实例的几种写法:InterfaceOne num1 = (i) -> i * 2; System.out.println(num1.doubleNum(10)); InterfaceOne num2 = i -> i * 2; // 指定参数类型 InterfaceOne num3 = (int