当前位置: 首页 > 知识库问答 >
问题:

基于一个字段的列表从对象列表中选择一些对象

谷光誉
2023-03-14

我有一个对象的arraylist,其中有一个字段“name”,还有一个名称列表。我必须从列表中选择包含任何名称的所有对象。如何在java中最有效地实现这一点。任何代码片段都将受到高度赞赏。

例子:

让类名为A

A由id、name、subject等字段组成。

那么让我们假设我有一个列表

所以假设我有第二个列表

List<String> namesList = List.of("alpha","beta");

因此,我只想从objectsA列表中选择那些名称字段由名称列表中的名称组成的对象,也就是说,我只想选择那些名称字段由“alpha”或“beta”组成的对象。

共有2个答案

安轶
2023-03-14

如果您有一个名称列表,则可以方便地将其转换为集,以便轻松检查是否包含名称:

final Set<String> names = new HashSet<>(namesList);
List<Person> people = ...;
List<Person> result = people.stream()
   .filter(p -> names.contains(p.getName()))
   .collect(Collectors.toList());

您可以避免使用Set,而只使用namesList,因为有一个List.contains方法,但是它会相当低效

皇甫浩壤
2023-03-14
final ArrayList<MyNamedObject> namedObjectList = ...;
final List<String> nameList = ...;

使用

namedObjectList.stream()
   .filter((final MyNamedObject o) -> nameList.stream().anyMatch((final String name) -> Objects.equals(name, o.getName())))
   .collect(Collectors.toList());

如果名称列表中有一些重复的值,请保留该列表,但使用。distinct()

namedObjectList.stream()
    .filter((final MyNamedObject o) -> nameList.stream().distinct().anyMatch((final String name) -> Objects.equals(name, o.getName())))
    .collect(Collectors.toList());

或创建一个集合:

final Set<String> nameSet = nameList.stream()
    .distinct()
    .collect(Collectors.toSet());
namedObjectList.stream()
    .filter((final MyNamedObject o) -> nameSet.stream().anyMatch((final String name) -> Objects.equals(name, o.getName())))
    .collect(Collectors.toList());

如果nameListnameSet可以包含null,请使用. filter(Object::nonNull)。如果nameo.getName()都不能为null,请将Objects.equals(name,o.getName()替换为name.equals(o.getName())

 类似资料:
  • 问题内容: 如何使用JOIN从一个表中选择所有列,从另一个表中仅选择一些列?在MySQL中。 问题答案: 只需使用表名: 这将选择所有列和列和从。

  • 嗨,我有两个对象列表。清单1和清单2 App1中的员工列表 在sql中,我们可以很容易地通过ID列进行连接。但是这里要点击seperate API来阅读清单2。 我可以从清单2创建map,并将EmpId作为键,继续从map获取对象,并将详细信息设置到清单1。 想知道有没有更好的方法来做这件事。

  • 如果标题听起来很模糊,我很抱歉。 我有个目标- 还有这些物品的清单- 我想通过合并具有相同帐户ID的对象来操作这个列表,方法是将vat字段和总计费用字段相加,前提是它们也具有相同的发票日期。 如果两个对象具有相同的帐户ID但不同的发票日期,则它们不应合并。

  • 我有两个对象列表,它们在两个列表中都有重复名称。我需要从清单2中删除清单1中的所有重复值。 下面是一个场景,类有名称变量,用这个变量需要检查清单1中的重复值并需要删除。 //这是具有3个对象的第一个列表 清单1大小为1 请建议我在Java8与流。

  • 我正在尝试根据另一个列表中存在的值筛选一个列表。我已经经历了其他类似的问题,并试图利用这些来实现我的目标,但无法做到这一点。 列表1由类(L1)的对象组成 列表2由类(L2)的对象组成 因此,筛选后,列表1将不包含,因为该模型与中的不匹配。 我怎么能这么做?

  • 假设有一个Obj类 你有一个实例列表,即