使用流式过滤器处理过滤用户所在的省、市、年龄、性别等。重点是后面的链式过滤器。
目标过滤User
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
public class User {
private String id;
private String name;
private String provinceCode;
private String cityCode;
private int age;
private int gender;
}
定义过滤器接口
public interface FilterService<T> {
/**
* 过滤器方法
* @param list
* @param value
* @return
*/
List<T> filter(List<T> list,String value);
}
定义各种过滤器实现
public class AgeFilter implements FilterService<User> {
@Override
public List<User> filter(List<User> list,String value) {
int age = Integer.parseInt(value);
return list.stream().filter(user -> user.getAge() >= age).collect(Collectors.toList());
}
}
public class GenderFilter implements FilterService<User> {
@Override
public List<User> filter(List<User> list,String value) {
int gender = Integer.parseInt(value);
return list.stream().filter(user -> user.getGender() == gender).collect(Collectors.toList());
}
}
public class ProvinceFilter implements FilterService<User> {
@Override
public List<User> filter(List<User> list,String value) {
return list.stream().filter(user -> user.getProvinceCode().equalsIgnoreCase(value)).collect(Collectors.toList());
}
}
public class CityFilter implements FilterService<User> {
@Override
public List<User> filter(List<User> list,String value) {
return list.stream().filter(user -> user.getCityCode().equalsIgnoreCase(value)).collect(Collectors.toList());
}
}
过滤器单元测试
@Slf4j
public class FilterTests {
static List<User> userList = new ArrayList<>();
static {
userList.add(new User(UUID.randomUUID().toString(),"boonya1","Sichuan","Chengdu",12,1));
userList.add(new User(UUID.randomUUID().toString(),"boonya2","Sichuan","Leshan",8,0));
userList.add(new User(UUID.randomUUID().toString(),"boonya3","Sichuan","Chengdu",30,1));
userList.add(new User(UUID.randomUUID().toString(),"boonya4","Sichuan","Ziyang",58,0));
userList.add(new User(UUID.randomUUID().toString(),"boonya5","Sichuan","Chengdu",80,1));
}
@Test
public void age(){
List<User> users = new AgeFilter().filter(userList,"18");
log.info("==age==filter==data = {}",users);
}
@Test
public void province(){
List<User> users = new ProvinceFilter().filter(userList,"Sichuan");
log.info("==province==filter==data = {}",users);
}
@Test
public void city(){
List<User> users = new CityFilter().filter(userList,"Chengdu");
log.info("==city==filter==data = {}",users);
}
@Test
public void gender(){
List<User> users = new GenderFilter().filter(userList,"1");
log.info("==city==filter==data = {}",users);
}
}
输出:
16:22:12.036 [main] INFO com.example.test.FilterTests - ==city==filter==data = [User(id=cfa84564-ebcc-4cf1-a52f-e32d88216eae, name=boonya1, provinceCode=Sichuan, cityCode=Chengdu, age=12, gender=1), User(id=adc0edbe-f8dd-43ba-a651-39ade01229a0, name=boonya3, provinceCode=Sichuan, cityCode=Chengdu, age=30, gender=1), User(id=20681388-c215-4933-8522-585212b09994, name=boonya5, provinceCode=Sichuan, cityCode=Chengdu, age=80, gender=1)]
16:22:15.851 [main] INFO com.example.test.FilterTests - ==province==filter==data = [User(id=cfa84564-ebcc-4cf1-a52f-e32d88216eae, name=boonya1, provinceCode=Sichuan, cityCode=Chengdu, age=12, gender=1), User(id=665ea3b8-7323-42fd-bcbd-20e8c808be1a, name=boonya2, provinceCode=Sichuan, cityCode=Leshan, age=8, gender=0), User(id=adc0edbe-f8dd-43ba-a651-39ade01229a0, name=boonya3, provinceCode=Sichuan, cityCode=Chengdu, age=30, gender=1), User(id=b3f6c270-e431-490a-be93-7eee084352e5, name=boonya4, provinceCode=Sichuan, cityCode=Ziyang, age=58, gender=0), User(id=20681388-c215-4933-8522-585212b09994, name=boonya5, provinceCode=Sichuan, cityCode=Chengdu, age=80, gender=1)]
16:22:25.013 [main] INFO com.example.test.FilterTests - ==age==filter==data = [User(id=adc0edbe-f8dd-43ba-a651-39ade01229a0, name=boonya3, provinceCode=Sichuan, cityCode=Chengdu, age=30, gender=1), User(id=b3f6c270-e431-490a-be93-7eee084352e5, name=boonya4, provinceCode=Sichuan, cityCode=Ziyang, age=58, gender=0), User(id=20681388-c215-4933-8522-585212b09994, name=boonya5, provinceCode=Sichuan, cityCode=Chengdu, age=80, gender=1)]
16:22:26.528 [main] INFO com.example.test.FilterTests - ==city==filter==data = [User(id=cfa84564-ebcc-4cf1-a52f-e32d88216eae, name=boonya1, provinceCode=Sichuan, cityCode=Chengdu, age=12, gender=1), User(id=adc0edbe-f8dd-43ba-a651-39ade01229a0, name=boonya3, provinceCode=Sichuan, cityCode=Chengdu, age=30, gender=1), User(id=20681388-c215-4933-8522-585212b09994, name=boonya5, provinceCode=Sichuan, cityCode=Chengdu, age=80, gender=1)]
链式过滤接口
链式过滤,就是将多个过滤器都加进来进行处理。
public interface FilterChainService<T> {
FilterChainService addChain(FilterService<T> filterService);
List<T> filter(List<T> dataList, String[] args);
}
链式过滤器实现
这里还是以用户为例,进行链式过滤。
public class UserChainFilter implements FilterChainService<User> {
List<FilterService> filterServices = new ArrayList<>();
@Override
public FilterChainService addChain(FilterService filterService) {
filterServices.add(filterService);
return this;
}
@Override
public List<User> filter(List<User> dataList, String[] args) {
Objects.requireNonNull(args);
int count = filterServices.size();
FilterService filterService;
for (int i = 0; i < count; i++) {
filterService = filterServices.get(i);
dataList = filterService.filter(dataList,args[i]);
if(CollectionUtils.isEmpty(dataList)){
break;
}
}
return dataList;
}
}
链式过滤单元测试
@Slf4j
public class UserChainFilterTests {
static List<User> userList = new ArrayList<>();
static {
userList.add(new User(UUID.randomUUID().toString(),"boonya1","Sichuan","Chengdu",12,1));
userList.add(new User(UUID.randomUUID().toString(),"boonya2","Sichuan","Leshan",8,0));
userList.add(new User(UUID.randomUUID().toString(),"boonya3","Sichuan","Chengdu",30,1));
userList.add(new User(UUID.randomUUID().toString(),"boonya4","Sichuan","Ziyang",58,0));
userList.add(new User(UUID.randomUUID().toString(),"boonya5","Sichuan","Chengdu",80,1));
}
@Test
public void chain(){
FilterChainService<User> filterChainService = new UserChainFilter()
.addChain(new ProvinceFilter())
.addChain(new AgeFilter())
.addChain(new GenderFilter());
List<User> users = filterChainService.filter(userList,new String[]{"Sichuan","18","1"});
log.info("===users=--size={}-={}",users.size(),users);
}
}
输出:
17:17:36.532 [main] INFO com.example.test.FilterChainTests - ===users=--size=2-=[User(id=5287ae1f-11f1-4106-b355-b258f21c668a, name=boonya3, provinceCode=Sichuan, cityCode=Chengdu, age=30, gender=1), User(id=968849e7-a12b-44a9-9473-deb1cf06daf3, name=boonya5, provinceCode=Sichuan, cityCode=Chengdu, age=80, gender=1)]