有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中以最快的方式基于收集的条件筛选数据

我有一个自定义数组列表,其中包含近600个条目

我需要根据一些条件过滤一些值。我尝试了一些基本的循环方法,但是这个过程非常耗时,我想要的是最快的数据过滤方法

public class MyModel {
  private boolean attempeted = false;
  private String answer;

  public MyModel(String answer) {
    this.answer = answer;
  }

  public void setAttempted(boolean attempeted) {
    this.attempeted = attempeted;
  }

  public String getAnswer() {
    return answer;
  }

  public boolean isAttempeted() {
    return attempeted;
  }

}

以上是我的模型我想要的是我只需要获得具有尝试值true的数据。这就是我所拥有的:

ArrayList<TestAnswerModel>myMainArrayList=array which contain all my data
ArrayList<TestAnswerModel>filterArrayList=new ArrayList<>();
for(int i=0;i<myMainArrayList.size();i++)
    {
        if(myMainArrayList.get(i).isAttempeted()) {
            filterArrayList.add(myMainArrayList.get(i))
        }
    }

上面的方法可以很好地工作,但是如果我的数据太大,则需要很多时间。此外,有时数据将为600,尝试的值仅为2或3个值的真值,因此此循环将在没有任何结果的情况下发生

我想要的是任何最快的方法来过滤数据


共 (2) 个答案

  1. # 1 楼答案

    在Java 8中,可以按如下方式进行筛选:

    List<TestAnswerModel> filterArrayList = myMainArrayList.stream()
        .filter(m -> m.isAttempeted()).collect(Collectors.toList());
    

    一个包含600个对象的列表应该在很短的时间内过滤掉,不管你采取什么方法。正如其他人所说,性能问题可能存在于代码的其他地方

  2. # 2 楼答案

    您希望收集列表中满足特定条件的所有条目。顺序循环基本上是到达目的地最快的方法。如果您希望5%或95%的列表元素出现在结果列表中,这没有什么区别-您必须查看所有条目来计算结果列表

    当然,您可以使用streams和过滤,因为这将允许您并行地使用parallelStream()和处理列表的部分

    但是:600个条目为。在现代硬件上,600个元素的处理只需眨眼的无数次

    因此,真正的答案是:在性能真正成为问题之前,不要担心性能。然后对应用程序进行分析,以确定解决该问题的真正性能瓶颈