Java Stream如何实现条件过滤?空ID集合时跳过过滤
有两种简洁的实现方式,核心是用x -> true表示「不过滤」的逻辑——这个Predicate对任何元素都返回true,所有元素都会通过过滤环节。
方式1:直接在filter中组合逻辑(最紧凑)
把空集合判断和过滤条件用逻辑或(||)组合,空集合时直接跳过过滤:
// 先把类型ID集合存到局部变量,避免重复调用getIds() Set<Long> targetTypeIds = types.getIds(); Map<String, Long> petCountByTypeName = pets.stream() .filter(pet -> targetTypeIds.isEmpty() || targetTypeIds.contains(pet.getType().getId())) .collect(Collectors.groupingBy( pet -> pet.getType().getName(), Collectors.counting() ));
方式2:用三元表达式定义Predicate(更清晰)
如果想把过滤逻辑单独抽离,用三元表达式返回对应的Predicate:
Set<Long> targetTypeIds = types.getIds(); Predicate<Pet> filterRule = targetTypeIds.isEmpty() ? pet -> true // 空集合时不过滤,保留所有元素 : pet -> targetTypeIds.contains(pet.getType().getId()); Map<String, Long> petCountByTypeName = pets.stream() .filter(filterRule) .collect(Collectors.groupingBy( pet -> pet.getType().getName(), Collectors.counting() ));
说明
pet -> true是关键:这个Lambda表达式实现了Predicate接口,对任何输入的Pet对象都返回true,所以filter会保留所有元素,达到「不过滤」的效果。- 提前把
types.getIds()赋值给局部变量targetTypeIds:避免在filter的每次判断中重复调用getIds(),如果getIds()是耗时操作或每次返回新集合,能提升性能、避免逻辑问题。
内容的提问来源于stack exchange,提问作者user21348253
相关产品推荐
相关产品推荐

