当前位置: 首页 > 面试题库 >

Java 8流:多个过滤器与复杂条件

蓬弘
2023-03-14
问题内容

有时你想过滤Stream具有多个条件的a:

myList.stream().filter(x -> x.size() > 10).filter(x -> x.isCool()) ...

或者你可以做同样的复杂条件和单 filter:

myList.stream().filter(x -> x.size() > 10 && x -> x.isCool()) ...

我的猜测是第二种方法具有更好的性能特征,但我不知道。

第一种方法赢得了可读性,但是哪种性能更好?


问题答案:

两种选择都必须执行的代码是如此相似,以致你无法可靠地预测结果。底层的对象结构可能有所不同,但这对热点优化器没有挑战。因此,这取决于其他周围条件,如果有任何差异,它们将使执行速度更快。

组合两个过滤器实例将创建更多的对象,从而创建更多的委托代码,但是如果你使用方法引用而不是lambda表达式(例如,替换filter(x -> x.isCool())为),则可以更改这种情况filter(ItemType::isCool)。这样,你就消除了为lambda表达式创建的综合委托方法。因此,与filter使用带有的lambda表达式的单个调用相比,使用两个方法引用组合两个过滤器可能会创建相同或更少的委托代码&&

但是,如上所述,这种开销将由HotSpot优化器消除,并且可以忽略不计。

理论上,两个过滤器比单个过滤器更容易并行化,但这仅与计算量大的任务有关¹。

因此,没有简单的答案。

最重要的是,不要考虑气味检测阈值以下的性能差异。使用更具可读性的内容。

¹…并且将需要一个实现对后续阶段进行并行处理的实现,这是标准Stream实现目前未采取的方法



 类似资料:
  • 有时您希望筛选具有多个条件的: 也可以使用复杂条件和单个: 第一种方法在可读性方面胜出,但在性能方面,什么更好呢?

  • 有可能在流中过滤更多次吗?例如,如果我有一个带有ID的列表,我想流一个HashMap,并将HashMap的键映射到列表中的键,以及它们在哪里匹配,我想从HashMap中获取对象,并再次过滤它,例如该对象中的int字段大于3,并在最后求和。例如,如果它发现10种情况,其中列表的键和HashMap的键相等,它过滤这10种情况,并发现3种情况,例如int字段大于3,它最终返回这些的总和。 到目前为止,这

  • 假设我有一张房间清单 每个房间都有一份人员名单。 使用java8 streams,我想迭代房间列表,获取所有人员,在每个节点上执行一些方法(doSomething()),并获取所有过滤对象的列表。 这是使用java 8的最佳实践吗?

  • 问题内容: 我正在尝试使用Pandas在几个条件下进行布尔索引。我原来的DataFrame称为。如果执行以下操作,将得到预期的结果: 但是,如果我这样做(我认为应该是等效的),则不会返回任何行: 知道导致差异的原因是什么? 问题答案: 使用是因为运算符优先级: 或者,在单独的行上创建条件: 样品 :

  • 问题内容: 我想像这样做一个ElasticSearch查询: 我试图像这样在NEST中实现它: 但这给了我这样的查询,其中的过滤器包装在 布尔值中 : 我应该如何更改我的NEST代码以提供正确的查询?是否必须将我的条款添加到 QueryContainer之外的 其他项目中? 问题答案: 如果要检查条件过滤器,可以在查询之前创建过滤器列表,如下所示: 如果在进行过滤器查询之前不需要检查任何条件,则可

  • 我试图创建一个函数,该函数接受多个谓词条件,并根据这些条件过滤流。我找不到任何东西,但我的retList似乎只是由输入组成,而不是输入的过滤版本。 以下是给我的指示: //要生成一个整数流,并将其设置为每个谓词p的输入,请将此流变量设置为对流应用过滤器(p)的结果。完成for-each循环后,像我们在前面的问题中所做的那样,将结果流收集到一个列表中,返回结果列表 这是我目前拥有的: 这就是它的测试