如何创建Java Predicate实现按字符串列表匹配过滤对象列表
问题解答
完全可以通过自定义Java Predicate实现该过滤需求,这也是Java Stream流过滤场景下的标准实现方案。
实现注意点
- 若存储匹配值的
List1数据量较大,建议先将其转换为HashSet存储,把元素存在判断的时间复杂度从O(n)降至O(1),避免过滤性能随数据量上涨明显下降。 - 单独抽离定义的
Predicate可以在多个过滤场景下复用,比直接写匿名判断逻辑灵活性更高。
代码实现示例
首先假设List2存储的对象结构如下:
public class BizObj { private Object key1; private String key2; // 构造方法、getter/setter public BizObj(Object key1, String key2) { this.key1 = key1; this.key2 = key2; } public String getKey2() { return key2; } }
核心过滤逻辑代码:
import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; public class ListFilterTest { public static void main(String[] args) { // 示例输入 List<String> list1 = List.of("A", "B", "C"); List<BizObj> list2 = List.of( new BizObj("obj1", "A"), new BizObj("obj2", "B"), new BizObj("obj3", "D"), new BizObj("obj4", "F") ); // 转换匹配列表为HashSet提升查询效率 Set<String> matchValues = new HashSet<>(list1); // 定义过滤用Predicate:判断对象key2值在匹配集合中 Predicate<BizObj> key2InList1Predicate = bizObj -> matchValues.contains(bizObj.getKey2()); // 执行过滤,得到最终结果 List<BizObj> filterResult = list2.stream() .filter(key2InList1Predicate) .collect(Collectors.toList()); // filterResult即为预期输出:仅包含key2为A、B的两个BizObj对象 } }
补充说明
- 如果业务场景中
key2可能为null,可以给Predicate增加非空判断避免异常,写法如下:
Predicate<BizObj> key2InList1Predicate = bizObj -> bizObj.getKey2() != null && matchValues.contains(bizObj.getKey2());
- 如果不需要复用过滤规则,也可以不单独定义Predicate变量,直接将判断逻辑传入
filter()方法:
List<BizObj> filterResult = list2.stream() .filter(bizObj -> matchValues.contains(bizObj.getKey2())) .collect(Collectors.toList());
内容的提问来源于stack exchange,提问作者Hrishikesh
相关产品推荐
相关产品推荐

