问题
有时候需要过滤集合数据,以前一直使用java8的流操作,确实比用for循环优雅很多。
但是这样也会出现大量冗余代码,比如:
List<Student> studentAgeGt10 = students.stream()
.filter(v->v.getAge()>10).collect(Collectors.toList());
List<Student> studentClazzEq5 = students.stream()
.filter(v->v.getClazz()==5).collect(Collectors.toList());
除了filter内的内容都是相同的内容,为什么不封装一下呢?
封装类
package com.riny.common.utils;
import java.util.*;
import java.util.function.Predicate;
public class PredicateFilterUtils {
/**
* map过滤器
* @param map
* @param predicate
* @param <K>
* @param <V>
* @return
*/
public static <K,V> Map<K,V> mapFilter(Map<K,V> map, Predicate<Map.Entry<K, V>> predicate) {
Map<K,V> resultMap = new HashMap<>();
for(Map.Entry<K,V> entry:map.entrySet()){
if(predicate.test(entry)){
resultMap.put(entry.getKey(),entry.getValue());
}
}
return resultMap;
}
/**
* list 过滤器
* @param list
* @param predicate
* @param <T>
* @return
*/
public static <T> List<T> listFilter(List<T> list, Predicate<T> predicate) {
List<T> resultList = new ArrayList<>();
for(T t:list){
if(predicate.test(t)){
resultList.add(t);
}
}
return resultList;
}
/**
* set 过滤器
* @param list
* @param predicate
* @param <T>
* @return
*/
public static <T> Set<T> listFilter(HashSet<T> list, Predicate<T> predicate) {
HashSet<T> resultSet = new HashSet<>();
for(T t:list){
if(predicate.test(t)){
resultSet.add(t);
}
}
return resultSet;
}
}
解释
1.在Filter中的内容是一个 Predicate对象,比如上面lambda表达式中的 “v->v.getAge()>10" 就是一个Predicate对象。
2. 使用test方法遍历传入list集合中的元素,符合条件就放入一个新的集合中。就可以对集合进行过滤了。
使用方法
List<Student> studentAgeGt10 = PredicateFilterUtils.listFilter(students,v->v.getAge()>10);
List<Student> studentClazzEq5 = PredicateFilterUtils.listFilter(students,v->v.getClazz()==5);
瞬间优雅了许多呢~!