JAVA函数式编程进阶Lambda函数式编程
函数编程简介
重用是建立在对象和类型系统之上。而Java 8中则将重用的概念更进一步,使用函数也能够实现代码的重用。
- 将函数作为参数传入到另外一个函数中
- 函数的返回值可以是函数类型
- 在函数中创建另一个函数
函数编程演变历
- 单一维度判断条件
public void filterElectronicsSkus() {
// 获得数组
List<Sku> cartSkuList = CartService.getCartSkuList()
// 查找购物车中数码类商品
List<Sku> result = CartService.filterElectronicsSkus(cartSkuList);
System.out.println(
JSON.toJSONString(result, true));
}
- 多维度判断条件
public void filterSkusByCategory() {
List<Sku> cartSkuList = CartService.getCartSkuList();
// 查找购物车中图书类商品集合
List<Sku> result = CartService.filterSkusByCategory(
cartSkuList, SkuCategoryEnum.BOOKS);
System.out.println(JSON.toJSONString(
result, true));
}
- 实体类作为参数
public void filterSkus() {
List<Sku> cartSkuList = CartService.getCartSkuList();
// 过滤商品总价大于2000的商品
List<Sku> result = CartService.filterSkus(
cartSkuList, new SkuTotalPricePredicate());
System.out.println(JSON.toJSONString(
result, true));
}
- 匿名类作为参数
public void filterSkus() {
List<Sku> cartSkuList = CartService.getCartSkuList();
// 过滤商品总价大于2000的商品
List<Sku> result = CartService.filterSkus(
cartSkuList, new SkuTotalPricePredicate());
System.out.println(JSON.toJSONString(
result, true));
}
- 匿名类作为参数
public void filterSkus() {
List<Sku> cartSkuList = CartService.getCartSkuList();
// 过滤商品单价大于1000的商品
List<Sku> result = CartService.filterSkus(
// SkuPredicate是一个接口函数
cartSkuList, new SkuPredicate() {
@Override
public boolean test(Sku sku) {
return sku.getSkuPrice() > 1000;
}
});
System.out.println(JSON.toJSONString(
result, true));
}
- Lambda表达式作为参数
public void filterSkus() {
List<Sku> cartSkuList = CartService.getCartSkuList();
// 过滤商品单价大于1000的商品
List<Sku> result = CartService.filterSkus(
cartSkuList,
(Sku sku) -> sku.getSkuPrice() > 1000);
System.out.println(JSON.toJSONString(
result, true));
}
Lambda表达简介
- JAVA8引入函数式编程
- 可以理解为一直匿名函数的替代
- 通过行为参数化传递代码
Lambda表达形式
- (parameters) -> expression
- (parameters) -> {statement}
函数接口
- 接口中只有一个抽象方法
- JAVA8的函数式接口注释:@FunctionInterface
- 函数式接口的抽象方法签名:函数描述符
方法引用
- 指向静态方法的方法引用 Integer::parseInt
- 指向任意类型实例方法的方法引用 String::length
- 指向现有对象的实例方法的方法引用 stringBuilder::append