为了账号安全,请及时绑定邮箱和手机立即绑定

根据其成员属性之一在对象列表中查找对象

根据其成员属性之一在对象列表中查找对象

FFIVE 2023-07-28 09:31:04
假设我有一个名为 的对象House,其中包含List<Room>:public class House {private List<Room> roomsList;public House(List<Room> rooms) {    roomsList = rooms;}/*Getter and Setter*/...对于 Room,只是一个属性color,其值由 表示int:public calss Room {private int color;public Room(int c) {    color = c;}/*Getter and Setter*/...现在,使用 Java 8,并给定一个已设置的对象House,我知道如何根据 的值在 my 中List<Room>查找对象,例如:RoomHousecolorRoom myRoom = house.getRooms.stream().filter(r -> r.getColor() == color).findFirst().orElse(null);我希望能够做的是,给定 aList<House>和值为int c,找到一个或多个属性等于Housea的Roomcolorc需要明确的是,对于我的用例:theList<House>既不为 null,也不为空;everyHouse都有一个List<Room>既不为 null 也不为空的 a;每个Room都有其属性color集;每个Room里面House都有独特的颜色最有可能(但不一定)只有 1 个具有给定Housea的Roomcolor我可以做这样的事情:List<House> houseList = /*a given list of houses*/int c = 4;House myHouse = null;for (House house : houseList) {    List<Room> rooms = house.getRooms();    Room roomOfRightColor = house.getRooms.stream().filter(r -> r.getColor() == color).findFirst().orElse(null);    if (room != null) {        myHouse = house;        break;    }if (myHouse == null) {/*Handle null*/}return myHouse;但也许有一种更聪明和/或更直接的方法来做到这一点?
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

我可以想象以前也有人问过类似的问题,技巧就在于下一个过滤操作:


private static Optional<House> test() {

    List<House> houseList = Arrays.asList(

            new House(new Room(1), new Room(3)),

            new House(new Room(5))

    );

    int color = 5;


    return houseList.stream()

            .filter(h -> h.getRooms()

                    .stream()

                    .anyMatch(r -> r.getColor() == color))

            .findFirst();

}

因此,在过滤器内部,您有第二个匹配项来检查内部列表。我确实将其更改为返回可选值而不是空值,但请随意应用适合您的内容。


查看完整回答
反对 回复 2023-07-28
  • 1 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信