按属性

时间:2015-12-29 07:11:20

标签: java

我有一个清单:

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”)。

如何通过特定属性在List中查找对象?在我的情况下,如何在List中找到名为“Peter”的对象?

请注意,我在列表中添加了数百个,有时是数千个不同的用户。每个“父母”都有一个唯一的名称。

3 个答案:

答案 0 :(得分:4)

显而易见的解决方案是在列表上进行迭代,当条件满足时,返回对象:

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

获取所有“彼得”用户的列表。

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

答案 1 :(得分:1)

回答你的问题:https://stackoverflow.com/a/1385698/2068880

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

然而,正如Ruakh所说,使用Map<String, UserItem>使其更快更合理更为合理。否则,它将迭代列表中的所有对象,以查找名称为&#34; Peter&#34;的用户。

答案 2 :(得分:0)

使用findAny

的parallelStream的其他方法
Optional<UserItem> optional = userList.parallelStream().findAny(p -> p.user.getName().equalsIgnoreCase("Peter"));
UserItem user = optional.isPresent() ? optional.get() : null;