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());
如果nameList
或nameSet
可以包含null
,则使用.filter(Objects::nonNull)
。如果 name
和 o.getName()
都不能是 null
,请将 Objects.equals(name, o.getName())
替换为 name.equals(o.getName())
。
我有一个对象数组列表,其中有一个字段“名称”,并且我有一个名称列表。我必须 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());
如果nameList
或nameSet
可以包含null
,则使用.filter(Objects::nonNull)
。如果 name
和 o.getName()
都不能是 null
,请将 Objects.equals(name, o.getName())
替换为 name.equals(o.getName())
。