通过属性在列表中查找特定对象

6

我有一个列表:

List<UserItem> userList = new ArrayList<>();

我应该在哪里添加以下内容:

User father = new User();
father.setName("Peter");

UserItem parent = new UserItem(father, null);
userList.add(parent);

我接下来创建另一个用户:
User daughter = new User();
daughter.setName("Emma");

UserItem child = new UserItem(daughter, <OBJECT IN LIST WHERE NAME IS "PETER">);
userList.add(child);

然而,我需要更改上面用<>包裹的文字,以便指定父对象(此处为“Peter”)并将其添加到先前添加的父对象中。 如何通过特定属性在列表中查找对象? 在我的情况下,我该如何找到名为“Peter”的对象?
请注意,我会以这种方式将数百甚至数千个不同用户添加到列表中。每个“父级”都有一个唯一的名称。

3
您确定需要一个“列表”吗?虽然可以通过迭代列表以获取所需元素,但这并不是最佳使用方法。看起来您需要一个Map<String, UserItem> - ruakh
我同意ruakh的观点。不过回答这个问题:你需要循环遍历列表,并找到用户名为“Peter”的用户。在你的第一个算法课程中,你肯定已经做过这样的事情了。 - JB Nizet
3个回答

11
明显的解决方案是遍历列表,当条件满足时返回对象:
for (User user : userList) {
    if ("peter".equals(user.getName()) {
        return user;
    }
}

您可以使用 filter(Java 8):

List<User> l = list.stream()
    .filter(s -> "peter".equals(s.getUser()))
    .collect(Collectors.toList());

获取包含所有“peter”用户的列表。

如评论中建议的,我认为在这里使用Map是一个更好的选择。


优雅的解决方案 - Abhishek

3

这里有你问题的答案:https://dev59.com/8nVD5IYBdhLWcg3wAGiD#1385698

Stream peters = userList.stream().filter(p -> p.user.name.equals("Peter"))

然而,正如ruakh所建议的那样,使用Map<String, UserItem>是更合理的选择,可以使其更快。否则,它将遍历列表中的所有对象以查找名为“Peter”的用户。


2
另一种使用parallelStream和findAny的方式。
Optional<UserItem> optional = userList.parallelStream().findAny(p -> p.user.getName().equalsIgnoreCase("Peter"));
UserItem user = optional.isPresent() ? optional.get() : null; 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接