编程范式
- 面对对象的编程方式:问题抽象为类,处理类之间的关系
- 函数式编程范式:函数代表抽象的计算
举例
订单统计订单总额、班级统计总分,统计逻辑相似但由于在不同类中 抽象出的计算模式: 保存计算结果的状态,有初始值
遍历操作
遍历时进行的计算,更新保存计算结果的状态值
lambda表达式:
实质返回的是一个匿名内部类 //配合函数式接口简化使用
public interface Condition {
boolean evaluate(Map<String, Object> param);
Condition conditionA = new Condition() {
@Override
public boolean evaluate(Map<String, Object> param) {
return false;
}
};
Condition conditionB = (param) -> {return false;};
Condition conditionC = param -> false;
}
范例
集合forEeach()方法的实现
List features = Arrays.asList("Lambdas","Default Method");
features.forEach(n -> System.out.println(n));
features.forEach(StringUtils::isEmpty); //方法引用是Lambda表达式的简写
原理
Iterator接口中的默认方法
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
高阶函数
- 高阶函数以其他函数作为输入,或产生其他函数作为输出
- 高阶函数使得函数的组合成为可能,更有利于函数的复用
public class HighOrderFunctions {
private static <T> Predicate<T> notEqual(T t) {
return (v) -> !Objects.equals(v, t);
}
//等价方法
private static <T> Predicate<T> notEqual1(T t) {
return new Predicate<T>() {
@Override
public boolean test(T v) {
return !Objects.equals(v,t);
}
};
}
public static void main(String[] args) {
Stream.of(1, 2, 3)
.filter(notEqual(1))
.forEach(System.out::println);
}
}
部分函数
部分函数(partial function)是指仅有部分输入参数被绑定了实际值的函数
public class PartialFunctions {
private static <T, U, R> Function<U, R> partialLeft(BiFunction<T, U, R> biFunction, T t) {
return (u) -> biFunction.apply(t, u);
}
private static <T, U, R> Function<T, R> partialRight(BiFunction<T, U, R> biFunction, U u) {
return (t) -> biFunction.apply(t, u);
}
public static void main(String[] args) {
BiFunction<Integer, Integer, Integer> biFunction = (v1, v2) -> v1 - v2;
Function<Integer, Integer> subtractFrom10 = partialLeft(biFunction, 10);
Function<Integer, Integer> subtractBy10 = partialRight(biFunction, 10);
System.out.println(subtractFrom10.apply(5)); // 5
System.out.println(subtractBy10.apply(5)); // -5
}
}
柯里化
通过柯里化,可以把有多个输入的函数转换成只有一个输入的函数 柯里化是把有多个输入参数的求值过程,转换成多个只包含一个参数的函数的求值过程