Java 按属性查找列表中的特定对象

Java 按属性查找列表中的特定对象,java,Java,我有一份清单: List<UserItem> userList = new ArrayList<>(); 然后创建另一个用户: User daughter = new User(); daughter.setName("Emma"); UserItem child = new UserItem(daughter, <OBJECT IN LIST WHERE NAME IS "PETER">); userList.add(child); 用户子节点=新用户

我有一份清单:

List<UserItem> userList = new ArrayList<>();
然后创建另一个用户:

User daughter = new User();
daughter.setName("Emma");

UserItem child = new UserItem(daughter, <OBJECT IN LIST WHERE NAME IS "PETER">);
userList.add(child);
用户子节点=新用户();
女儿。集名(“艾玛”);
UserItem子项=新的UserItem(子项,);
userList.add(子级);
但是,我需要将上面
中包装的文本更改为我之前添加的父对象(父对象),由名称指定(本例中为“Peter”)

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


请注意,我在列表中添加了成百上千的不同用户。每个“父对象”都有一个唯一的名称。

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

for (User user : userList) {
    if ("peter".equals(user.getName()) {
        return user;
    }
}
您可以使用
过滤器
(Java 8):

List l=List.stream()
.filter(s->“peter”.equals(s.getUser()))
.collect(Collectors.toList());
获取所有“peter”用户的列表


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

您的问题的答案如下:


然而,正如ruakh所建议的,使用
Map
使其更快更为合理。否则,它将迭代列表中的所有对象以查找名为“Peter”的用户。

另一种方法是使用带有findAny的parallelStream

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

您确定要“列表”吗?当然可以迭代列表以获得所需的特定元素,但这并不是使用它们的最佳方式。听起来你想要一张
地图
。我同意鲁克的看法。但要回答这个问题,您需要在列表上循环,并找到名为“Peter”的用户。在你的第一个算法课程中,你肯定已经做过了。优雅的解决方案
List<User> l = list.stream()
    .filter(s -> "peter".equals(s.getUser()))
    .collect(Collectors.toList());
Stream peters = userList.stream().filter(p -> p.user.name.equals("Peter"))
Optional<UserItem> optional = userList.parallelStream().findAny(p -> p.user.getName().equalsIgnoreCase("Peter"));
UserItem user = optional.isPresent() ? optional.get() : null;