簡體   English   中英

如何使用流解決以下練習

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM