首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用streams解决下列练习

如何使用streams解决下列练习
EN

Stack Overflow用户
提问于 2021-11-10 11:46:59
回答 5查看 86关注 0票数 0

在下面的练习中,我应该保留所有的房间,其中有SmartLamps。我如何用流来解决这个问题?由于每个SmartLamp都有属性空间,所以我需要在房间和灯具上流动。我试着用anyMatch来做这件事,但是找不到一个可行的解决方案。有人能帮忙吗?(我知道如何在没有流的情况下解决这个问题)

代码语言:javascript
复制
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>”

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2021-11-10 12:22:20

使用anyMatch并不是错误的,而只是在错误的地方使用:

代码语言:javascript
复制
public void deleteRooms() {
    rooms = rooms.stream().filter(r -> lamps.stream().map(SmartLamp::getRoom).anyMatch(r::equals);
}

但是上面的内容并不理想,因为你必须反复查看每个房间的灯具列表。提前提取所有出现在灯具列表中的房间可以帮助您:

代码语言:javascript
复制
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

代码语言:javascript
复制
public void deleteRooms() {
    Set<Room> smartRooms = lamps.stream().map(SmartLamp::getRoom).collect(Collectors.toSet());
    rooms.removeIf(r -> !smartRomms.contains(r));
}
票数 3
EN

Stack Overflow用户

发布于 2021-11-10 11:57:25

我应该保留所有的房间,里面有SmartLamps。

好吧,你可以这样做.

代码语言:javascript
复制
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;
}
}

这能解决你的问题吗?在评论中告诉我。

票数 2
EN

Stack Overflow用户

发布于 2021-11-10 11:55:23

代码语言:javascript
复制
lamps.stream().map(SmartLamp::getRoom).anyMatch(rooms::contains);

谓词不需要流,您需要创建一个lambda room -> ...

但是,您已经为映射灯创建了一个流,所以我将从该流开始。而真正的contains不是很好,但足够好。

一个Set<Room>会更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69912756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档