[英]How can I solve the following exercise with streams
在下面的練習中,我應該保留所有房間,其中有 SmartLamps。 我怎樣才能用流解決這個問題? 由於每個 SmartLamp 都有屬性 Room 我需要流過房間和燈。 我試圖用 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));
}
}
代碼給出錯誤:“類型不匹配:無法從流轉換為謂詞<?超級房間>”
使用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));
}
lamps.stream().map(SmartLamp::getRoom).anyMatch(rooms::contains);
謂詞不需要流,您需要創建一個 lambda room -> ...
。
但是,您已經必須為映射燈創建一個流,所以我將從該流開始。 而且真的contains
不是很好,但足夠好。
Set<Room>
會更好。
我應該保留所有裝有 SmartLamp 的房間。
好的,所以你可以這樣做......
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;
}
}
這能解決您的問題嗎? 在評論中告訴我。
你可以試試
lamps.stream()
.map(SmartLamp::getRoom)
.filter(rooms::contains)
.collect(Collectors.toSet());
我相信 anymatch 不是你想要的。 Any match 是一種流方法,如果流中的任何內容與您想要的匹配,則返回 true 或 false。
但不管你想要一個謂詞
這是形式
List<Room> lampRoomList = lamps.stream().map(SmartLamp::getRoom).ToList()
//predicate is in the filter method
List<Room> roomsWithLamps = rooms.stream().filter(room.toroom -> lampRoomList.Contains(Room)).toList();
其中第二行中的 room 表示流中的對象。 在你的情況下一個房間。
第一行是保存燈中所有房間的列表,因此您不需要為每個房間進行映射。
您可以在此處閱讀有關謂詞的更多信息https://www.geeksforgeeks.org/java-8-predicate-with-examples/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.