一、函数式编程
1.1 概念
面向对象思想需要关注用什么对象完成什么事情。而函数式编程思想就类似于我们数学中的函数。它主要关注的是对数据进行了什么操作。
函数式编程是一种编程范式,它将计算视为函数的运算过程。函数式编程强调将程序分解成独立的、无状态的函数,避免使用可变的状态和共享的数据。函数式编程主要基于数学中的Lambda演算理论和一些数学函数的概念。
函数式编程具有以下特点:
-
纯函数:函数式编程中的函数是纯函数,即给定相同的输入,总是产生相同的输出,不会对外部状态产生任何影响。
-
不可变数据:函数式编程中的数据一旦创建就不会被修改,任何改变都是通过创建新的数据来实现。
-
高阶函数:函数可以作为参数传递给其他函数,也可以作为返回值返回。
-
递归:函数式编程中常使用递归来进行迭代和重复的操作。
-
引用透明:函数式编程中的函数调用可以被视为对表达式的求值,因此引用透明性是一个重要的特点,即可以替换函数调用的结果而不影响程序的行为。
1.2 优点
1.代码简洁,开发快速
2.接近自然语言,易于理解
3.易于"并发编程"
二、Lambda表达式
2.1 概念
- lambda是JDK8中的一个语法糖,可以对某些匿名内部类的写法进行优化,让函数式编程只关注数据而不是对象。
- 基本格式:(参数列表)->{代码}
Lambda可以对某些匿名内部类的写法进行简化,Lambda表达式只支持函数式接口。也就是只有一个抽象方法的接口。因此,可以对某些匿名内部类进行简化的条件是:
1.是一个接口的匿名内部类
2.这个接口中只有一个抽象方法。
当满足这两个条件,就可以使用Lambda对这个匿名内部类进行简化。
Lambda表达式是一种匿名函数,它可以简化对于单一方法接口(Single Abstract Method,SAM)的实现。
2.2 语法
(参数列表)->{代码}
2.3 案例
2.3.1 案例一
匿名内部类的写法
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("新线程的run()执行了!");
}
}).start();
}
以上是还未被Lambda优化的一个匿名内部类,当使用Lambda优化过后,如下:
public static void main(String[] args) {
new Thread(() ->{
System.out.println("新线程的run()执行了2!");
}).start();
}
2.3.2 案例二
匿名内部类的写法
public class LambdaTest {
public static void main(String[] args) {
//对printNum()方法进行调用
LambdaTest.printNum(new IntPredicate() { //对接口的实现
@Override
public boolean test(int value) {
return value%2==0;
}
});
}
//自定义一个printNum()方法
public static void printNum(IntPredicate predicate){
int[] arr={1,2,3,4,5,6,7,8,9,10};
for (int i:arr){
if(predicate.test(i)){
System.out.println(i);
}
}
}
}
采用Lambda表达式的
public class LambdaTest {
public static void main(String[] args) {
LambdaTest.printNum((int value)-> {
return value%2==0;
}
);
}
public static void printNum(IntPredicate predicate){
int[] arr={1,2,3,4,5,6,7,8,9,10};
for (int i:arr){
if(predicate.test(i)){
System.out.println(i);
}
}
}
}