如何在 Java 对象列表中进行搜索

2022-09-01 02:52:54

我有一个对象列表,列表非常大。对象是

class Sample {
    String value1;
    String value2;
    String value3;
    String value4;
    String value5;
 }

现在,我必须在列表中搜索对象的特定值。假设我是否必须返回这些对象(我的搜索并不总是基于值3)value3=='three'

该列表是

List<Sample> list = new ArrayList<Sample>();

什么是有效的方法?

谢谢。


答案 1

你可以试试Apache Commons Collections

有一个类 CollectionUtils 允许您按自定义谓词选择或筛选项目。

您的代码将如下所示:

Predicate condition = new Predicate() {
   boolean evaluate(Object sample) {
        return ((Sample)sample).value3.equals("three");
   }
};
List result = CollectionUtils.select( list, condition );

更新:

java8中,使用Lambdas和StreamAPI应该是:

List<Sample> result = list.stream()
     .filter(item -> item.value3.equals("three"))
     .collect(Collectors.toList());

好多了!


答案 2

使用 Java 8

使用Java 8,您只需将列表转换为,即可编写:

import java.util.List;
import java.util.stream.Collectors;

List<Sample> list = new ArrayList<Sample>();
List<Sample> result = list.stream()
    .filter(a -> Objects.equals(a.value3, "three"))
    .collect(Collectors.toList());

请注意,

  • a -> Objects.equals(a.value3, "three")是一个 lambda 表达式
  • result是带有类型的ListSample
  • 它非常快,每次迭代都没有投射
  • 如果您的过滤器逻辑变得更重,您可以代替(阅读此文)list.parallelStream()list.stream())


Apache Commons

如果你不能使用Java 8,你可以使用Apache Commons库并编写:

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;

Collection result = CollectionUtils.select(list, new Predicate() {
     public boolean evaluate(Object a) {
         return Objects.equals(((Sample) a).value3, "three");
     }
 });

// If you need the results as a typed array:
Sample[] resultTyped = (Sample[]) result.toArray(new Sample[result.size()]);

请注意:

  • 每次迭代都有一个从 到 的强制转换ObjectSample
  • 如果需要将结果键入为 ,则需要额外的代码(如我的示例所示)Sample[]



奖励:一篇很好的博客文章,讨论如何在列表中查找元素。