猿问

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

假设我有一个名为 的对象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>查找对象,例如:RoomHousecolor


Room 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;

但也许有一种更聪明和/或更直接的方法来做到这一点?


FFIVE
浏览 122回答 1
1回答

白猪掌柜的

我可以想象以前也有人问过类似的问题,技巧就在于下一个过滤操作:private static Optional<House> test() {&nbsp; &nbsp; List<House> houseList = Arrays.asList(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new House(new Room(1), new Room(3)),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new House(new Room(5))&nbsp; &nbsp; );&nbsp; &nbsp; int color = 5;&nbsp; &nbsp; return houseList.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .filter(h -> h.getRooms()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .anyMatch(r -> r.getColor() == color))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .findFirst();}因此,在过滤器内部,您有第二个匹配项来检查内部列表。我确实将其更改为返回可选值而不是空值,但请随意应用适合您的内容。
随时随地看视频慕课网APP

相关分类

Java
我要回答