如何筛选包含指定配料列表中任意配料的Pizza对象流?
过滤包含任意指定配料的Pizza Stream
核心实现方案
要筛选出包含目标配料列表中任意一种配料的Pizza流,你可以在filter中结合Stream.anyMatch()方法实现:
// 假设目标配料列表为 List<String> targetToppings Stream<Pizza> pizzasWithAnyTargetTopping = pizzas.filter(pizza -> targetToppings.stream().anyMatch(topping -> pizza.toppings().contains(topping)) );
代码逻辑解释
- 外层
filter负责逐个校验每个Pizza对象; - 内层通过
targetToppings.stream()将目标配料列表转为流,调用anyMatch()判断:只要目标配料列表中有任意一个配料存在于当前Pizza的配料列表中,anyMatch()就返回true,该Pizza会被保留到结果流中。
性能优化建议
如果目标配料列表元素较多,建议先将其转为HashSet——Set的contains()方法时间复杂度为O(1),远优于List的O(n),能大幅提升匹配效率:
Set<String> targetToppingSet = new HashSet<>(targetToppings); Stream<Pizza> pizzasWithAnyTargetTopping = pizzas.filter(pizza -> pizza.toppings().stream().anyMatch(targetToppingSet::contains) );
这里我们反过来遍历当前Pizza的配料,检查是否有任意一个配料存在于目标Set中,逻辑和之前完全等价,但性能更优。
内容的提问来源于stack exchange,提问作者Kajander
相关产品推荐
相关产品推荐

