lambda表达式主要表现形式为函数式接口的使用。
函数式接口:只有一个待实现方法的接口。
格式:() - > {code} 左侧代表入参,右侧代表需要执行的逻辑。
实现接口方法,由原始实现转变至lambda实现
接口:MyPredicate
//添加该注解后接口中只能存在一个待实现的方法,添加多个会报错。
//可以添加多个已实现的方法
@FunctionalInterface
public interface MyPredicate<T>{
boolean handler(T t);
}
public static List<UserPo> list;
static {
list = new ArrayList<UserPo>(){{
add(new UserPo("zhangsan",20,new Date(),"shanghai","cn"));
add(new UserPo("lisi",24,new Date(),"shanghai","cn"));
add(new UserPo("wangwu",25,new Date(),"shanghai","cn"));
add(new UserPo("zhaoliu",27,new Date(),"shanghai","cn"));
add(new UserPo("tianqi",27,new Date(),"shanghai","cn"));
}};
}
public List<UserPo> handler(List<UserPo> list, MyPredicate<UserPo> myPredicate){
List<UserPo> us = new ArrayList<>();
for (UserPo u : list) {
if(myPredicate.handler(u)){
us.add(u);
}
}
return us;
}
***以策略模式实现接口方法
演化步骤:
java7:
创建子类实现该接口
public class MyPredicateByAge implements MyPredicate<UserPo> {
@Override
public boolean handler(UserPo t) {
return t.getAge()>21;
}
}
调用接口方法
/**
* 条件筛选
* 自定义接口实现
* 匿名内部类实现
*/
@Test
public void test(){
//策略模式 筛选条件 ==》年纪大于21的 自定义接口实现
List<UserPo> handler3 = handler(list, new MyPredicateByAge());
//策略模式 筛选条件 ==》年纪大于21的 匿名内部类
List<UserPo> handler4 = handler(list, new MyPredicate<UserPo>() {
@Override
public boolean handler(UserPo userPo) {
return userPo.getAge()>21;
}
});
}
java8:
@Test
public void test(){
//lambda 筛选条件 ==》年纪大于21的
List<UserPo> handler = handler(list, (e) -> e.getAge() > 21);
System.out.println("------------------------------------------------------");
//stream 筛选条件 ==》年纪大于21的
List<UserPo> collect = list.stream().filter(e -> e.getAge() > 21).collect(Collectors.toList());
}
执行handler(list, (e) -> e.getAge() > 21)时lambda替代了MyPredicate<UserPo> myPredicate
(e) -> e.getAge() > 21具体表示方法 boolean handler(T t) 的实现。
左侧 e 代表入参 T t。
右侧 e.getAge() > 21 代表 handler方法所执行的具体逻辑。
lambda
- 左侧可以是空参、单参或多参,参数类型可写可不写。
- 右侧为方法执行的具体逻辑,单行逻辑可以省略大括号,多行逻辑代码需包裹在大括号中。