目录
一.什么是函数式编程
1.函数式编程的特点
2.函数式编程的优缺点
二.什么是Lambda
1.Lambda表达式的优缺点
2.Lambda表达式的语法
3.Lambda表达式的重要特征
4.Lambda表达式的底层实现
5. Lambda表达式的函数式接口
三.Lambda具体应用场景
1.使用() -> {} 替代匿名类
2.以流水线的方式处理数据
3.数据并行处理
4. 用内部迭代取代外部迭代
函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。和过程化编程相比,函数式编程里函数的计算可随时调用。
优点:
缺点:
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
优点:
缺点:
Java8中Lambda 表达式由三个部分组成:
第一部分为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数;
第二部分为一个箭头符号:->;
第三部分为方法体,可以是表达式和代码块。
1. 方法体为表达式,该表达式的值作为返回值返回。
(parameters) -> expression
//求和
(int a,int b) -> return a + b;
2. 方法体为代码块,必须用 {} 来包裹起来,且需要一个return返回值,但函数式接口里面方法返回值是 void,无需返回值。
(parameters) -> { statements; }
//求平方
(int a) -> {return a * a;}
//打印,无返回值
(int a) -> {System.out.println("a = " + a);}
java8内部Lambda表达式的实现方式在本质是以匿名内部类的形式的实现的。
package Lambda;
import java.util.function.IntBinaryOperator;
/**
* test
* @author lc
*/
public class Test {
public static void main(String[] s) {
/**
* 定义了一个叫binaryOperator的Lambda表达式,返回值是一个IntBinaryOperator实例。
*/
IntBinaryOperator binaryOperator = (int a, int b) -> {
return a + b;
};
/**
* 利用binaryOperator计算
*/
int result = binaryOperator.applyAsInt(1,2);
System.out.println(result);
}
}
查看IntBinaryOperator这个接口,发现这是一个被@FunctionalInterface注解的接口,@FunctionalInterface标注了这是一个函数式接口,所以(int a, int b) -> {return a + b;}返回的一个IntBinaryOperator的匿名实现类。
@FunctionalInterface
public interface IntBinaryOperator {
/**
* Applies this operator to the given operands.
*
* @param left the first operand
* @param right the second operand
* @return the operator result
*/
int applyAsInt(int left, int right);
}
Java8中已经定义了很多常用的函数式接口,它们都放在java.util.function包下面,一般有以下常用的四大核心接口:
package Lambda;
/**
* @author lc
*/
public class ThreadDemo {
public static void main(String[] s) {
/**
* 不使用Lambda
*/
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("no use lambda");
}
});
/**
* 使用Lambda,代码要简洁一些
*/
Thread t2 = new Thread(() -> System.out.println("use lambda"));
t1.run();
t2.run();
}
}
/**
* Stream
* @author lc
*/
public class StreamDemo {
public static void main(String[] s) {
List integers = Arrays.asList(4, 5, 6,1, 2, 3,7, 8,8,9,10);
//过滤出偶数列表 [4,6,8,8,10]
List evens = integers.stream().filter(i -> i % 2 == 0).collect(Collectors.toList());
//转成平方列表
List squareList = integers.stream().map(i -> i * i).collect(Collectors.toList());
}
}
数据并行处理,只需要在原来的基础上加一个parallel()就可以开启,这里parallel()开启的底层并行框架是fork/join,默认的并行数是Ncpu个。
//转成平方列表,并行处理
List squareList1 = integers.stream().parallel().map(i -> i * i).collect(Collectors.toList());
package Lambda;
import java.util.Arrays;
import java.util.List;
/**
* forEach
* @author lc
*/
public class FechEachDemo {
public static void main(String[] s) {
//外部迭代
List features1 = Arrays.asList("Lambdas", "Default Method", "StreamAPI");
for (String feature : features1) {
System.out.println(feature);
}
//内部迭代
List features2 = Arrays.asList("Lambdas", "Default Method", "StreamAPI");
features2.stream().forEach(n -> System.out.println(n));
}
}
学习参考:
https://baike.baidu.com/item/%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B/4035031?fr=aladdin
https://www.cnblogs.com/linlinismine/p/9283532.html
http://www.runoob.com/java/java8-lambda-expressions.html