编程范式
- 面对对象的编程方式:问题抽象为类,处理类之间的关系
- 函数式编程范式:函数代表抽象的计算
举例
订单统计订单总额、班级统计总分,统计逻辑相似但由于在不同类中 抽象出的计算模式: 保存计算结果的状态,有初始值
遍历操作
遍历时进行的计算,更新保存计算结果的状态值
lambda表达式:
实质返回的是一个匿名内部类 //配合函数式接口简化使用
public interface Condition {boolean evaluate(Map<String, Object> param);Condition conditionA = new Condition() {@Overridepublic 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>() {@Overridepublic 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)); // 5System.out.println(subtractBy10.apply(5)); // -5}}
柯里化
通过柯里化,可以把有多个输入的函数转换成只有一个输入的函数 柯里化是把有多个输入参数的求值过程,转换成多个只包含一个参数的函数的求值过程
