我有一个清单:
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”的对象?
请注意,我在列表中添加了数百个,有时是数千个不同的用户。每个“父母”都有一个唯一的名称。
答案 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;