如何在 Java 对象列表中搜索

新手上路,请多包涵

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

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

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

清单是

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

这样做的有效方法是什么?

谢谢。

原文由 Jeevi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 833
2 个回答

您可以尝试 Apache Commons Collections

有一个类 CollectionUtils 允许您通过自定义 Predicate 选择或过滤项目。

您的代码将是这样的:

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

好多了!

原文由 Esteve 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用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 是一个 List 和一个 Sample 类型
  • 速度非常快,每次迭代都不会强制转换
  • 如果你的过滤器逻辑变得更重,你可以做 list.parallelStream() 而不是 list.stream()阅读这个

阿帕奇公地

如果你不能使用 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[] ,则需要额外的代码(如我的示例所示)

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

原文由 Yves M. 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题