java 按属性在列表中查找特定对象
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/34506218/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Find specific object in a List by attribute
提问by user5725851
I have a list:
我有一个清单:
List<UserItem> userList = new ArrayList<>();
Where I add the following:
我添加以下内容:
User father = new User();
father.setName("Peter");
UserItem parent = new UserItem(father, null);
userList.add(parent);
I then create another user:
然后我创建另一个用户:
User daughter = new User();
daughter.setName("Emma");
UserItem child = new UserItem(daughter, <OBJECT IN LIST WHERE NAME IS "PETER">);
userList.add(child);
However, I need to change the text wrapped in <>
above to the parent object I added before (the father), specified by the name ("Peter" in this case).
但是,我需要将<>
上面包裹的文本更改为我之前添加的父对象(父亲),由名称(在本例中为“Peter”)指定。
How can I find an object in a List by a specific attribute?In my case, how can I find the object in the List that has the name "Peter"?
如何通过特定属性在列表中找到对象?就我而言,如何在 List 中找到名为“Peter”的对象?
Please note that I add hundreds, sometimes thousands, of different users like this to the list. Each "parent" has a unique name.
请注意,我在列表中添加了数百个,有时是数千个这样的不同用户。每个“父母”都有一个唯一的名字。
回答by Maroun
The obvious solution would be iterating on the list and when the condition is met, return the object:
显而易见的解决方案是在列表上迭代,当条件满足时,返回对象:
for (User user : userList) {
if ("peter".equals(user.getName()) {
return user;
}
}
And you can use filter
(Java 8):
你可以使用filter
(Java 8):
List<User> l = list.stream()
.filter(s -> "peter".equals(s.getUser()))
.collect(Collectors.toList());
to get a list with all "peter" users.
获取所有“peter”用户的列表。
As suggested in comments, I think using Map
is a better option here.
正如评论中所建议的,我认为Map
这里使用是更好的选择。
回答by maydos
Answer to your question is here: https://stackoverflow.com/a/1385698/2068880
您的问题的答案在这里:https: //stackoverflow.com/a/1385698/2068880
Stream peters = userList.stream().filter(p -> p.user.name.equals("Peter"))
However, as ruakh suggested, it's more reasonable to use Map<String, UserItem>
to make it faster. Otherwise, it will iterate all the objects in the list to find users with name "Peter".
但是,正如 ruakh 所建议的那样,使用Map<String, UserItem>
它来使其更快更合理。否则,它将遍历列表中的所有对象以查找名为“Peter”的用户。
回答by Viet
Other way with parallelStream with findAny
使用带有 findAny 的 parallelStream 的其他方式
Optional<UserItem> optional = userList.parallelStream().findAny(p -> p.user.getName().equalsIgnoreCase("Peter"));
UserItem user = optional.isPresent() ? optional.get() : null;