Select 基于一个字段列表的对象列表中的一些对象

Select some objects from a list of objects based on list of one field

我有一个对象数组列表,其中有一个字段“名称”,并且我有一个名称列表。我必须 select 包含列表中任何名称的所有对象。我怎样才能最有效地在 java 中实现这一目标。任何代码片段将不胜感激。

示例:

设class名字为A

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

因此,假设我有一个列表
List<A> objectsA
,假设其长度为 10。在此列表中,名称字段由各种名称组成,例如 alpha、beta , gama, delta 等

假设我有第二个列表

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

所以我只想 select objectsA 列表中名称字段由 namesList 中的名称组成的对象,即我只想 select 名称字段由“alpha”或“测试版”。

如果您有 List 个名称,那么将其转换为 Set 可能更方便,这样您就可以轻松检查它是否包含名称:

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 方法,但是它的效率相当低

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

或创建 Set:

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(Objects::nonNull)。如果 nameo.getName() 都不能是 null,请将 Objects.equals(name, o.getName()) 替换为 name.equals(o.getName())