在下面的练习中,我应该保留所有的房间,其中有SmartLamps。我如何用流来解决这个问题?由于每个SmartLamp都有属性空间,所以我需要在房间和灯具上流动。我试着用anyMatch来做这件事,但是找不到一个可行的解决方案。有人能帮忙吗?(我知道如何在没有流的情况下解决这个问题)
public class SmartHome {
private final List<Room> rooms;
private final List<SmartLamp> lamps;
public void deleteRooms() {
rooms.stream().anyMatch(lamps.stream().map(SmartLamp::getRoom));
}
}代码产生错误:“类型不匹配:无法从流转换为Predicate<?超级Room>”
发布于 2021-11-10 12:22:20
使用anyMatch并不是错误的,而只是在错误的地方使用:
public void deleteRooms() {
rooms = rooms.stream().filter(r -> lamps.stream().map(SmartLamp::getRoom).anyMatch(r::equals);
}但是上面的内容并不理想,因为你必须反复查看每个房间的灯具列表。提前提取所有出现在灯具列表中的房间可以帮助您:
public void deleteRooms() {
Set<Room> smartRooms = lamps.stream().map(SmartLamp::getRoom).collect(Collectors.toSet());
rooms = rooms.stream().filter(r -> smartRomms.contains(r)).collect(Collectors.toList());
}或者使用List.removeIf
public void deleteRooms() {
Set<Room> smartRooms = lamps.stream().map(SmartLamp::getRoom).collect(Collectors.toSet());
rooms.removeIf(r -> !smartRomms.contains(r));
}发布于 2021-11-10 11:57:25
我应该保留所有的房间,里面有SmartLamps。
好吧,你可以这样做.
public class SmartHome {
private final List<Room> rooms;
private final List<SmartLamp> lamps;
void deleteRoomsWithoutSmartLamps() {
var goodRooms = roomsWithSmartLamps();
// This line will remove the bad rooms from the list
rooms = rooms.stream().filter( r -> goodRooms.contains(r)).collect(toList())
}
// This method gives you a list of rooms with smart lamps
public List<Room> roomsWithSmartLamps() {
var goodRooms = lamps.stream().filter( lamp -> lamp.isSmartLamp() ).map(lamp -> lamp.getRoom()).filter(room != null)collect(toList());
return goodRooms;
}
}这能解决你的问题吗?在评论中告诉我。
发布于 2021-11-10 11:55:23
lamps.stream().map(SmartLamp::getRoom).anyMatch(rooms::contains);谓词不需要流,您需要创建一个lambda room -> ...。
但是,您已经为映射灯创建了一个流,所以我将从该流开始。而真正的contains不是很好,但足够好。
一个Set<Room>会更好。
https://stackoverflow.com/questions/69912756
复制相似问题