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

Java8流:多过滤器与复杂条件

束阳旭
2023-03-14

有时您希望筛选具有多个条件的

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

也可以使用复杂条件和单个筛选器:

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

第一种方法在可读性方面胜出,但在性能方面,什么更好呢?

共有1个答案

许俊风
2023-03-14

必须为两个备选方案执行的代码是如此相似,以至于您无法可靠地预测一个结果。底层对象结构可能不同,但这对热点优化器没有什么挑战。因此,如果有任何差异,它取决于其他环境条件,这些环境条件将屈服于更快的执行。

组合两个筛选器实例将创建更多html" target="_blank">对象,从而创建更多委托代码,但如果使用方法引用而不是lambda表达式,这可能会发生变化,例如,将filter(x->x.iscool())替换为filter(itemtype::iscool)。这样就消除了为lambda表达式创建的合成委托方法。因此,使用两个方法引用组合两个筛选器可能会创建与使用带有&的lambda表达式的单个filter调用相同或更少的委派代码。

但是,如前所述,这种开销将被热点优化器消除,并且可以忽略不计。

理论上,两个过滤器可能比单个过滤器更容易并行化,但这只适用于计算量较大的任务“。

所以没有简单的答案。

并且将需要一个实现对后续阶段进行并行处理,这是标准流实现目前没有走的路

 类似资料:
  • 问题内容: 有时你想过滤具有多个条件的a: 或者你可以做同样的复杂条件和单 filter: 我的猜测是第二种方法具有更好的性能特征,但我不知道。 第一种方法赢得了可读性,但是哪种性能更好? 问题答案: 两种选择都必须执行的代码是如此相似,以致你无法可靠地预测结果。底层的对象结构可能有所不同,但这对热点优化器没有挑战。因此,这取决于其他周围条件,如果有任何差异,它们将使执行速度更快。 组合两个过滤器

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

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

  • 如何使用java8流和过滤器过滤嵌套循环? 假设我有一个汽车列表(

  • 我试图理解Java的流API的内部调用。 我有下面的代码,它有两个过滤器(中间)操作和一个终端操作。 我看到,对于每个中间操作,都会返回一个新流,并使用重写的方法。一旦它命中terminal方法,流就执行。如果有两个操作,我看到正在运行两次,而不是一次。 我想了解一个流遍历如何能够调用过滤器两次。 粘贴下面的IntPipeline代码,在Stream中为filter方法命中该代码。

  • 我正在用Java8为一个文件编写一个解析器。使用读取该文件,并返回一个顺序的。 每一行都映射到一个数据对象,如下所示: 现在我们可以将流中的每一行映射到相应的结果: 但是,流现在包含要删除的值: 如我在中所知,如果需要结果,我如何组合映射/筛选操作?