定义:函数作为参数传递到方法中。用一个表达式实现一个接口
需求一:过滤商品价格超过10元的商品
// 伪代码
// 商品类
class Goods{
// 价格
int price;
// 生产日期
Date productDate;
// public getter settter tostring
}
List<Student> goodsList= new ArrayList();
goodsList.add(new Goods(10,"20200415"));
goodsList.add(new Goods(20,"20210415"));
goodsList.add(new Goods(30,"20220415"));
// 伪代码
// 过滤商品的方法
public List<Goods> fliterGoods(List<Goods> GoodsList){
List<Goods> GoodsListFilter = new ArrayList();
for(Goods goods : GoodsList){
if(goods.getPrice>10){
GoodsListFilter.add(goods)
}
}
}
fliterGoods(goodsList)
需求二:过滤商品价格超过15元的商品
// 粘一份一摸一样的代码 只是判断条件给改了
// 过滤商品的方法
public List<Goods> fliterGoods(List<Goods> GoodsList){
List<Goods> GoodsListFilter = new ArrayList();
for(Goods goods : GoodsList){
if(goods.getPrice>15){
GoodsListFilter.add(goods)
}
}
}
fliterGoods(goodsList)
需求三:过滤商品价格超过20元的商品
// 粘一份一摸一样的代码 只是判断条件给改了
// 过滤商品的方法
public List<Goods> fliterGoods(List<Goods> GoodsList){
List<Goods> GoodsListFilter = new ArrayList();
for(Goods goods : GoodsList){
if(goods.getPrice>20){
GoodsListFilter.add(goods)
}
}
}
fliterGoods(goodsList)
如果说这个时候还有新的需求,代码只能粘一份出来,且代码复用的太多了
解决方式一: 使用接口减少代码复用
需求一:过滤商品价格超过10元的商品
// 接口文件
public interface filterGoods{
public Boolean fliter(Goods good)
}
// 接口的实现类
class filterGoodsImpl implements filterGoods{
@override
public Boolean fliter(Goods good){
return goods.getPrice>10
}
}
// 过滤的方法
public List<Goods> fliterGoods(List<Goods> GoodsList,filterGoods myfilterInterface){
List<Goods> GoodsListFilter = new ArrayList();
for(Goods goods : GoodsList){
if(myfilterInterface.fliter){
GoodsListFilter.add(goods)
}
}
}
// 方法使用
fliterGoods(GoodsList,new filterGoodsImpl())
需求二:过滤商品价格超过15元的商品
// 接口的实现类
class filterGoodsImpl implements filterGoods{
@override
public Boolean fliter(Goods good){
return goods.getPrice>15
}
}
// 方法调用
需求三:过滤商品价格超过20元的商品
// 接口的实现类
class filterGoodsImpl implements filterGoods{
@override
public Boolean fliter(Goods good){
return goods.getPrice>20
}
}
// 方法调用
解决方式二: 使用匿名内部类接口文件
// 接口文件
public interface filterGoods{
public Boolean fliter(Goods good)
}
// 过滤的方法
public List<Goods> fliterGoods(List<Goods> GoodsList,filterGoods myfilterInterface){
List<Goods> GoodsListFilter = new ArrayList();
for(Goods goods : GoodsList){
if(myfilterInterface.fliter){
GoodsListFilter.add(goods)
}
}
}
// 方法使用----------过滤商品价格超过10元的商品
fliterGoods(GoodsList,new filterGoods(){
@override
public Boolean fliter(Goods good){
return goods.getPrice>10
}
})
// 方法使用----------过滤商品价格超过15元的商品
fliterGoods(GoodsList,new filterGoods(){
@override
public Boolean fliter(Goods good){
return goods.getPrice>15
}
})
// 方法使用----------过滤商品价格超过20元的商品
fliterGoods(GoodsList,new filterGoods(){
@override
public Boolean fliter(Goods good){
return goods.getPrice>20
}
})
解决方式三: 使用lambda简化书写
// 接口文件
public interface filterGoods{
public Boolean fliter(Goods good)
}
// 过滤的方法
public List<Goods> fliterGoods(List<Goods> GoodsList,filterGoods myfilterInterface){
List<Goods> GoodsListFilter = new ArrayList();
for(Goods goods : GoodsList){
if(myfilterInterface.fliter){
GoodsListFilter.add(goods)
}
}
}
// 方法使用----------过滤商品价格超过10元的商品
fliterGoods(GoodsList,(good)-> good.getPrice()>10)
// 方法使用----------过滤商品价格超过15元的商品
fliterGoods(GoodsList,(good)-> good.getPrice()>15)
// 方法使用----------过滤商品价格超过20元的商品
fliterGoods(GoodsList,(good)-> good.getPrice()>20)
是不是相当哇塞!!
下面写一个例子demo
// 伪代码,写一个lambda,对字符串进行任意操作(转小写,截取,转大写等)
// 1 写一个接口
interface lambdaStr{
public String operateStr(String str);
}
// 2 写处理字符串的方法
public String handle(String str,lambdaStr mylambdastr){
return mylambdastr.operateStr(str)
}
// 3 调用方法,写lambda
handle("aaaa",(x)->{
// 这里写对字符串的操作(转小写,截取,转大写等)
return x+"1"
})