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

时间:2019-09-13 10:45:10

标签: java list

假设我有一个名为System.out.println(myCombinedMap); {1.0=10.0, 2.0=20.0, 3.0=30.0} 的对象,其中包含一个House

List<Room>

对于Room,只是一个属性public class House { private List<Room> roomsList; public House(List<Room> rooms) { roomsList = rooms; } /*Getter and Setter*/ ... ,其值由color表示:

int

现在,使用Java 8,并给一个对象public calss Room { private int color; public Room(int c) { color = c; } /*Getter and Setter*/ ... 设置了一个House,我知道如何基于一个List<Room>在我的Room中找到一个对象Housecolor,例如:

Room myRoom = house.getRooms.stream().filter(r -> r.getColor() == color).findFirst().orElse(null);

我想做的是,在给定List<House>和值int c的情况下,找到一个或多个House,其属性为Room color等于c

在我的用例中,请明确一点:

  • List<House>既不为null也不为空;

  • 每个House的{​​{1}}都不为null或为空;

  • 每个List<Room>都设置了属性Room

  • color中的每个Room都有唯一的颜色

  • 最有可能(但不一定)只有1个House和给定House中的Room

我可以做这样的事情:

color

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

1 个答案:

答案 0 :(得分:0)

我可以想像以前曾问过类似的问题,诀窍是在下一个过滤器操作中:

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();
}

因此,在过滤器中,您具有第二个匹配项,用于检查内部列表。我确实对其进行了更改,以返回一个可选的而不是null的选项,但是可以随意应用对您有用的内容。