概念
- 函数式编程是一种编程范式
- 函数作为第一对象
- 注重描述而不是具体的执行步骤
- 更加关心代数的结构之间的关系
- 不可变
//Lambda表达式
public static void fun(T param1, R param2...){
...
}
XXFunction fun = (T param1, R param2...) -> {
...
}
语法
- 参数类型可以推导
- 单行可以省略大括号
- 单参数可省略小括号
//语法
(int a, int b) -> {return a+b;}
(a,b) -> a+b
a -> a*a
() -> 1
方法引用
- 静态方法: 需要告知属于哪个类
classX :: methodName
- 构造方法:需要告知属于哪个类
classX :: new
- 指定实例方法:需要告知属于哪个实例
instance::methodName
总结
特点
- 不可变
- 惰性求值
- 闭包
- 高阶函数
- 柯里化
- 部分应用
- 结合率
实例
函数式接口SAM(Single Abstract Method)
//非必须,如果加上,编译器会进行校验
@FunctionIterface
//必须是interface
public interface Runnable{
//单个非默认/静态实现方法
public abstract void run();
}
//调用时:
Runnable r = () -> System.out.println("K");
输入 | 返回值 | class | 解释 |
---|---|---|---|
T | R | Function<T,R> | 输入T 返回R |
void | T | Supplier | 无输入返回T |
T | void | Consumer | 输入T 无返回(消费者类型) |
void | void | Runnable | 无输入无输出 |
T | Boolean | Predicate | 输入T 返回Boolean |
T | T | UnaryOperator | 输入T 返回T |
Stream
Stream特点:
- Stream可以是无限的
- Stream可并行处理
- Stream可能延迟处理
创建Stream
- 静态数据Stream.of()
- 容器:collection.stream()
- 动态:Stream.iterate() 或者是Stream.generate()
- 其他api:Files.lines()…