如何用Java Stream筛选包含SmartLamp的Room并解决类型不匹配报错
报错原因
Stream.anyMatch() 方法要求传入的参数是 Predicate<? super T> 类型的断言函数,你传入的是 lamps.stream().map(SmartLamp::getRoom) 返回的 Stream<Room> 对象,类型不匹配因此触发编译错误。
正确实现方案
方案1:预提取关联Room集合(推荐,性能更高)
先将所有SmartLamp关联的Room提取为Set集合,后续判断的时间复杂度可从O(n*m)降低到O(n+m),适合数据量较大的场景:
import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; public class SmartHome { private final List<Room> rooms; private final List<SmartLamp> lamps; public void deleteRooms() { // 提取所有被SmartLamp关联的Room Set<Room> lampRelatedRooms = lamps.stream() .map(SmartLamp::getRoom) .filter(Objects::nonNull) // 可选:过滤掉lamp关联Room为空的情况 .collect(Collectors.toSet()); // 过滤保留存在关联lamp的Room,更新原集合 List<Room> reservedRooms = rooms.stream() .filter(lampRelatedRooms::contains) .collect(Collectors.toList()); rooms.clear(); rooms.addAll(reservedRooms); } }
方案2:嵌套Stream判断(适合小数据量场景)
如果数据量很小,也可以直接在过滤时嵌套遍历lamps集合判断:
import java.util.Objects; import java.util.stream.Collectors; public class SmartHome { private final List<Room> rooms; private final List<SmartLamp> lamps; public void deleteRooms() { List<Room> reservedRooms = rooms.stream() .filter(room -> lamps.stream() .map(SmartLamp::getRoom) .anyMatch(lampRoom -> Objects.equals(lampRoom, room)) ) .collect(Collectors.toList()); rooms.clear(); rooms.addAll(reservedRooms); } }
注意事项
Room类必须正确重写equals()和hashCode()方法,否则基于对象相等的判断逻辑会失效。
内容的提问来源于stack exchange,提问作者CuriousIndeed
相关产品推荐
相关产品推荐

