【问题标题】:Find specific object in a List by attribute按属性在列表中查找特定对象
【发布时间】:2016-04-03 01:15:20
【问题描述】:

我有一个清单:

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

但是,我需要将上面&lt;&gt; 中包裹的文本更改为我之前添加的父对象(父亲),由名称指定(在本例中为“Peter”)。

如何通过特定属性在 List 中找到对象? 就我而言,如何在 List 中找到名称为“Peter”的对象?

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

【问题讨论】:

  • 您确定要“列表”吗?当然可以遍历一个列表来获得你想要的特定元素,但这并不是使用它们的最佳方式。听起来你想要一个Map&lt;String, UserItem&gt;
  • 我同意鲁克的观点。但要回答这个问题:您需要遍历列表,并找到名称为“Peter”的用户。当然,您之前在您的第一个算法课程中就已经这样做了。

标签: java


【解决方案1】:

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

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”用户的列表。

按照 cmets 的建议,我认为在这里使用 Map 是一个更好的选择。

【讨论】:

  • 优雅的解决方案
【解决方案2】:

您的问题的答案在这里:https://stackoverflow.com/a/1385698/2068880

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

但是,正如 ruakh 所建议的,使用Map&lt;String, UserItem&gt; 使其更快更合理。否则,它将遍历列表中的所有对象以查找名称为“Peter”的用户。

【讨论】:

    【解决方案3】:

    parallelStream 和 findAny 的其他方式

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

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 2018-03-20
      • 2016-07-26
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多