当前位置: 首页 > 知识库问答 >
问题:

我应该在一个循环中使用几个流吗?

颜乐
2023-03-14

假设我们正在使用这个类:

public Student{
  String name;
  Integer age;
  Integer height;
  Integer weight;
}

现在我们有了一个学生名单,我们被问到了一些问题,比如:

  • 筛选姓名为“Jonh”的人并得到平均年龄
  • 过滤那些名字是“玛丽”的人并获得最大的高度
  • 过滤那些名字是“ben”的人,得到最小的权重

我认为一个干净易懂的解决方案是使用lambdas按名称过滤并得到所要求的内容:

List<Student> students = ...
double jonhAge = students.stream().filter(s->s.getName().equals("Jonh").mapToInt(s->s.getAge()).average()
double maryHeight = students.stream().filter(s->s.getName().equals("Mary").mapToInt(s->s.getHeight()).max()
double benWeight = students.stream().filter(s->s.getName().equals("Ben").mapToInt(s->s.getWeight()).min()

我想它至少要在列表上迭代3次,使用带有条件的单个循环可能更有效:

double jonhAge = 0;
double jonhCount = 0;
double maryHeight = 0;
double benWeight = 1000;
for(Student s : students){
  if(s.getName.equals("Jonh")){
    jonhAge += s.getAge();
    jonhCount++;
  }else if(s.getName.equals("Mary")){
    if(s.getHeight()>maryHeight)
      maryHeight = s.getHeight();
  }else if(s.getName.equals("Ben")){
    if(s.getWeight()<benWeight )
      benWeight = s.getWeight();
  }
}
jonhAge = jonhAge / jonhCount;

我认为第一种方法更干净,但第二种更快。我说的对吗?我该用哪一个?想象一下,学生列表包含了数量巨大的元素,名字比Jonh、Mary和Ben还要多。

共有2个答案

柯翔
2023-03-14

做你更喜欢的事。在您的情况下,您不会注意到速度的差异,即使在一个更大的程序中,这也不是一个问题,我们不再生活在1999年,在那里您将不得不选择性能更好的一个。只要有编码的乐趣:)

您还可以做的是,使用一个流过滤所有不需要的值,然后将结果存储到您选择的数据类型中,如数组,然后将这些值赋给变量(如果您需要:)或者将其放入映射中

此外,我强烈建议您在YouTube上了解更多关于stream api搜索的信息,以便进行Devoxx的讨论,他们很好地解释了这个主题

邵赞
2023-03-14

我觉得你想对了问题。您当然可以尝试循环,以避免在同一数据流上多次传递。然而,也有更有趣的流方法来做到这一点。

List<String> goodNames = ...put in names you want to see...;
Map<String, List<Student>> postsPerName = students.stream().filter(goodNames::contains).collect(groupingBy(Student::getName));

然后您就有了一个映射,其中只有您关心的名称,并且所有元素都与它们的名称匹配。

这就是“完美”的解决方案吗?也许,也许不是。但这都是一种平衡。祝你好运!

 类似资料:
  • 我正在做一个游戏,有三个骰子方块,点击一个按钮就会显示出随机的面孔。图像由css图像精灵生成。如果随机数为1,则骰子立方体将分配给具有图像精灵的css类。 我有一个单独的按钮,当点击它时,应该运行上面的diceroll功能到三个div,ID为dice1、dice2和dice3。 我想用 我研究了一下,但找不到实现最后两行注释代码的方法。请让我知道我的方法是否正确,并帮助我与代码。

  • 问题内容: 我有一些副作用要应用,并且想知道如何组织它们: 一次性使用 或几个useEffects 在性能和体系结构上有什么更好的选择? 问题答案: 您需要遵循的模式取决于您的useCase。 首先 ,您可能遇到以下情况:在初始安装期间需要添加事件侦听器,并在卸载时对其进行清理,而在另一种情况下,则需要清理特定的侦听器并在prop更改时将其重新添加。在这种情况下,使用两个不同的useEffect更

  • 问题内容: 假设我有维护父/子结构的代码。在这样的结构中,我得到了循环引用,其中子级指向父级,父级指向子级。我应该为他们担心吗?我正在使用Python 2.5。 我担心它们将不会被垃圾回收,并且应用程序最终将消耗所有内存。 问题答案: “担心”放错了地方,但是,如果您的程序运行缓慢,消耗的内存超出预期,或者出现奇怪的莫名其妙的暂停,则原因很可能是在那些垃圾引用循环中- 它们需要由程序集进行垃圾收集

  • 问题内容: 我想做的是请用户输入一些字符串以读入数组,然后要求用户输入该数量的字符串并将其读入数组。当我运行此代码时,它从不要求我在第一个for循环的第一个循环中输入内容,只打印出“字符串#0:字符串#1:”,然后我就可以输入文本了。为什么会这样,我做错了什么? 问题答案: 缓冲。 输入输入数量时,不会在输入缓冲区中占用换行符的位置。在for循环的迭代0中,缓冲区中已经有一行输入,并且可以立即完成

  • 我试着阅读有关Spring BOM、Spring Boot和Spring IO的文档。 但没有说明,我们应该如何一起使用还是不使用? 在我项目中,我们已经有了自己的父POM,所以我不能将它们用作父POM,但它们都有其他的方法可以使用,如下面定义依赖项管理 您需要Spring BOM、Spring Boot和Spring IO resolve版本 那么它们之间到底有什么区别呢?我更喜欢哪一个?在哪种